Subversion Repositories eFlore/Applications.cel

Rev

Rev 3857 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
3638 delphine 1
 <?php
2
// declare(encoding='UTF-8');
712 jpm 3
/**
3638 delphine 4
 * Service affichant les dernières photo publiques du CEL ouvrable sous forme de diaporama.
5
 * Encodage en entrée : utf8
6
 * Encodage en sortie : utf8
712 jpm 7
 *
8
 * Cas d'utilisation et documentation :
3638 delphine 9
 * @link http://www.tela-botanica.org/wikini/eflore/wakka.php?wiki=AideCELWidgetPhoto
712 jpm 10
 *
11
 * Paramètres :
3638 delphine 12
 * ===> extra = booléen (1 ou 0)  [par défaut : 1]
13
 * Affiche / Cache la vignette en taille plus importante au bas du widget.
14
 * ===> vignette = [0-9]+,[0-9]+  [par défaut : 4,3]
15
 * Indique le nombre de vignette par ligne et le nombre de ligne.
712 jpm 16
 *
3638 delphine 17
 * @author              Jean-Pascal MILCENT <jpm@tela-botanica.org>
18
 * @license     GPL v3 <http://www.gnu.org/licenses/gpl.txt>
19
 * @license     CECILL v2 <http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt>
20
 * @version     $Id$
21
 * @copyright   Copyright (c) 2010, Tela Botanica (accueil@tela-botanica.org)
712 jpm 22
 */
23
class Saisie extends WidgetCommun {
1050 jpm 24
 
712 jpm 25
        const DS = DIRECTORY_SEPARATOR;
3638 delphine 26
        const SERVICE_DEFAUT = 'saisie';
1580 jpm 27
        const WS_SAISIE = 'CelWidgetSaisie';
1888 mathias 28
        const WS_UPLOAD = 'CelWidgetUploadImageTemp';
1580 jpm 29
        const WS_OBS = 'CelObs';
3638 delphine 30
        const WS_COORD = 'CoordSearch';
31
        const LANGUE_DEFAUT = 'fr';
32
        const PROJET_DEFAUT = 'base';
1580 jpm 33
        const WS_NOM = 'noms';
34
        const EFLORE_API_VERSION = '0.1';
3638 delphine 35
        const WIDGETS_SPECIAUX = ['tb_aupresdemonarbre','tb_streets','tb_lichensgo'];
36
        const SQUELETTES_SPECIAUX = ['arbres','plantes','lichens'];
37
        const WS_OBS_LIST = 'InventoryObservationList';
38
        const WS_IMG_LIST = 'celImage';
39
        private $cel_url_tpl = null;
40
        /** Si spécifié, on ajoute une barre de navigation inter-applications */
41
        private $bar;
42
        //private $parametres_autorises = array('projet', 'type', 'langue', 'order');
43
        private $parametres_autorises = array(
44
                        'projet' => 'projet',
45
                        'type' => 'type',
46
                        'langue' => 'langue',
47
                        'order' => 'order'
48
        );
712 jpm 49
        /**
3638 delphine 50
         * Méthode appelée par défaut pour charger ce widget.
712 jpm 51
         */
52
        public function executer() {
3638 delphine 53
                $retour = null;
54
                // Pour la création de l'id du cache nous ne tenons pas compte du paramètre de l'url callback
55
                unset($this->parametres['callback']);
56
                extract($this->parametres);
57
                $this->bar = (isset($bar)) ? $bar : false;
58
                /* Le fichier Framework.php du Framework de Tela Botanica doit être appelé avant tout autre chose dans l'application.
59
                 Sinon, rien ne sera chargé.
60
                 L'emplacement du Framework peut varier en fonction de l'environnement (test, prod...). Afin de faciliter la configuration
61
                 de l'emplacement du Framework, un fichier framework.defaut.php doit être renommé en framework.php et configuré pour chaque installation de
62
                 l'application.
63
                 Chemin du fichier chargeant le framework requis */
64
                $framework = dirname(__FILE__).'/framework.php';
65
                if (!file_exists($framework)) {
66
                        $e = "Veuillez paramêtrer l'emplacement et la version du Framework dans le fichier $framework";
67
                        trigger_error($e, E_USER_ERROR);
68
                } else {
69
                        // Inclusion du Framework
70
                        require_once $framework;
71
                        // Ajout d'information concernant cette application
72
                        Framework::setCheminAppli(__FILE__);// Obligatoire
73
                        Framework::setInfoAppli(Config::get('info'));// Optionnel
712 jpm 74
 
2500 mathias 75
                }
3638 delphine 76
                $langue = (isset($langue)) ? $langue : self::LANGUE_DEFAUT;
77
                $this->langue = I18n::setLangue($langue);
78
                $this->parametres['langue'] = $langue;
1050 jpm 79
 
3638 delphine 80
                if (!isset($mode)) {
81
                        $mode = self::SERVICE_DEFAUT;
3042 mathias 82
                }
3638 delphine 83
                if (!isset($projet)) {
84
                        $this->parametres['projet'] = self::PROJET_DEFAUT;
85
                }
3042 mathias 86
 
3638 delphine 87
                $methode = $this->traiterNomMethodeExecuter($mode);
712 jpm 88
                if (method_exists($this, $methode)) {
89
                        $retour = $this->$methode();
90
                } else {
3638 delphine 91
                        $this->messages[] = "Ce type de service '$methode' n'est pas disponible.";
712 jpm 92
                }
93
 
3638 delphine 94
                $contenu = ''; //print_r($retour);exit;
95
                if (is_null($retour)) {
96
                        $this->messages[] = 'La ressource demandée a retourné une valeur nulle.';
97
                } else {
98
                        if (isset($retour['donnees'])) {
99
                                // ne pas afficher le projet dans l'url si on est dans saisie de base
3662 delphine 100
                                $projet_dans_url = ( $this->parametres['projet'] !== 'base') ? '?projet='. $this->parametres['projet'].'&'.'langue='.$this->parametres['langue'] : '';
3638 delphine 101
 
102
                                $retour['donnees']['conf_mode'] = $this->config['parametres']['modeServeur'];
103
                                $retour['donnees']['prod'] = ($this->config['parametres']['modeServeur'] === 'prod');
104
                                $retour['donnees']['bar'] = $this->bar;
105
                                $retour['donnees']['url_base'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['cheminDos']);
3700 idir 106
                                $retour['donnees']['url_remarques'] = $this->config['chemins']['widgetRemarquesUrl'];
3638 delphine 107
                                $retour['donnees']['url_ws_annuaire'] = sprintf($this->config['chemins']['baseURLServicesAnnuaireTpl'], 'utilisateur/identite-par-courriel/');
108
                                $retour['donnees']['url_ws_saisie'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_SAISIE);
109
                                $retour['donnees']['url_ws_obs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS);
110
                                $retour['donnees']['url_ws_upload'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_UPLOAD);
3844 idir 111
                                $retour['donnees']['url_ws_geoloc'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD);
3638 delphine 112
                                $retour['donnees']['authTpl'] = $this->config['manager']['authTpl']. $projet_dans_url;
113
                                $retour['donnees']['mode'] = $mode;
114
                                $retour['donnees']['langue'] = $langue;
115
                                $retour['donnees']['widgets_url'] = sprintf($this->config['chemins']['baseURLAbsoluDyn'],'');
116
                                $retour['donnees']['url_ws_obs_list'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_OBS_LIST);
117
                                $retour['donnees']['url_ws_cel_imgs'] = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_IMG_LIST) . '/liste-ids?obsId=';
118
                                $retour['donnees']['url_ws_cel_img_url'] = str_replace ( '%s.jpg', '{id}XS', $this->config['chemins']['celImgUrlTpl'] );
119
                                $squelette = dirname(__FILE__).self::DS.'squelettes'.self::DS.$retour['squelette'].'.tpl.html';
120
                                switch ( $retour['squelette'] ) {
121
                                        case 'apa':
122
                                                $retour['donnees']['squelette'] = $this->parametres['projet'];
123
                                                break;
124
                                        case 'apaforms':
125
                                                $retour['donnees']['squelette'] = $this->parametres['squelette'];
126
                                                break;
127
                                        default:
128
                                                $retour['donnees']['squelette'] = $retour['squelette'];
129
                                                break;
130
                                }
131
                                $contenu = $this->traiterSquelettePhp($squelette, $retour['donnees']);
1475 aurelien 132
                        } else {
3638 delphine 133
                                $this->messages[] = 'Les données à transmettre au squelette sont nulles.';
1475 aurelien 134
                        }
712 jpm 135
                }
3638 delphine 136
                $this->envoyer($contenu);
712 jpm 137
        }
1050 jpm 138
 
3638 delphine 139
 
140
        private function executerSaisie() {
141
                $retour = array();
142
                if (in_array($this->parametres['projet'], self::WIDGETS_SPECIAUX) ) {
143
                        if (isset($this->parametres['squelette']) && in_array($this->parametres['squelette'], self::SQUELETTES_SPECIAUX) ) {
144
                                $retour['squelette'] = 'apaforms';
2408 jpm 145
                        } else {
3638 delphine 146
                                $retour['squelette'] = 'apa';
1050 jpm 147
                        }
719 jpm 148
                } else {
3638 delphine 149
                        $retour['squelette'] = 'saisie';
150
                        $retour['donnees']['general']     = I18n::get('General');
151
                        $retour['donnees']['aide']        = I18n::get('Aide');
152
                        $retour['donnees']['observateur'] = I18n::get('Observateur');
153
                        $retour['donnees']['observation'] = I18n::get('Observation');
154
                        $retour['donnees']['image']       = I18n::get('Image');
155
                        $retour['donnees']['chpsupp']     = I18n::get('Chpsupp');
156
                        $retour['donnees']['resume']      = I18n::get('Resume');
719 jpm 157
                }
3638 delphine 158
                $retour['donnees']['widget'] = $this->rechercherProjet();
159
                return $retour;
719 jpm 160
        }
1526 jpm 161
 
3638 delphine 162
        /* Recherche si le projet existe sinon va chercher les infos de base */
163
        private function rechercherProjet() {
164
                // projet avec un squelette défini (et non juste un mot-clé d'observation)
165
                $estProjetDefini = true;
166
                $tab = array();
167
                $url = $this->config['manager']['celUrlTpl'].'?projet='.$this->parametres['projet'].'&langue='.$this->parametres['langue'];
168
                $json = $this->getDao()->consulter($url);
169
                if (!in_array($this->parametres['projet'], self::WIDGETS_SPECIAUX)){
170
                        if ( $json !== "[]") {
171
                                $tab = $this->rechercherChampsSupp();
172
                        } else {
173
                                $url = $this->config['manager']['celUrlTpl'].'?projet=base&langue='.$this->parametres['langue'];
174
                                $json = $this->getDao()->consulter($url);
175
                                $estProjetDefini = false;
176
                        }
177
                }
178
                $tableau = json_decode($json, true);
179
                $tableau = $this->traiterParametres($estProjetDefini, $tableau[0]);
180
                if (
181
                        isset($this->parametres['squelette']) &&
182
                        ($this->parametres['squelette'] === 'plantes' || $this->parametres['squelette'] === 'lichens')
183
                ) {
184
                        $tableau['type_especes'] = 'liste';
185
                        if ( $this->parametres['squelette'] === 'lichens' ) {
3799 delphine 186
                                $tableau['referentiel'] = 'taxreflich';
3638 delphine 187
                        }
188
                }
189
                $tableau['especes'] = $this->rechercherInfosEspeces($tableau);
190
                if (isset($tableau['type_especes']) && 'fixe' === $tableau['type_especes']) {
191
                        // si on trouve ":" dans referentiel, referentiel = première partie
192
                        $tableau['referentiel'] = (strstr($tableau['referentiel'],':',true)) ?: $tableau['referentiel'];
193
                }
194
                $tableau['milieux'] = ($tableau['milieux'] != '') ? explode(';', $tableau['milieux']) : [];
195
                if(!isset($this->parametres['id-obs'])) {
196
                        if (isset($this->parametres['dept']) || isset($this->parametres['commune'],$this->parametres['dept']) || isset($this->parametres['code_insee'])) {
197
                                $localisation = $this->traiterParamsLocalisation($this->parametres);
198
                                // les paramètres dans l'url peuvent surcharger les données de localisation de la bdd
199
                                if ($localisation) $tableau['localisation'] = $localisation;
200
                        }
201
                        if (isset($tableau['localisation'])) $tableau['localisation'] = $this->traiterLocalisation($tableau['localisation']);
202
                }
203
                if (isset($tableau['motscles'])) {
204
                if (isset($tableau['tag-obs'])) {
205
                    $tableau['tag-obs'] .= $tableau['motscles'];
206
                    } else if (isset($tableau['tag-img'])) {
207
                        $tableau['tag-img'] .= $tableau['motscles'];
208
                    } else {
209
                        $tableau['tag-obs'] = $tableau['tag-img'] = $tableau['motscles'];
210
                    }
211
 
212
                }
213
                $tableau['chpSupp'] = $tab;
214
                $langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
215
                $tableau['chemin_fichiers'] = sprintf( $this->config['chemins']['baseURLAbsoluDyn'], $this->config['manager']['imgProjet'] . $tableau['projet'] . $langue_projet_url . '/' );
216
                return $tableau;
1476 aurelien 217
        }
1050 jpm 218
 
3638 delphine 219
        /* Recherche si un projet a des champs de saisie supplémentaire */
220
        private function rechercherChampsSupp() {
221
                $retour = array();
222
                $projet = $this->parametres['projet'];
223
                $url = $this->config['manager']['celChpSupTpl'] .'?projet=' . $projet . '&langue=' . $this->parametres['langue'];
224
                $json = $this->getDao()->consulter($url);
225
                $retour = json_decode($json, true);
1526 jpm 226
 
3638 delphine 227
                foreach ( $retour[$projet]['champs-supp'] as $key => $chsup ) {
1526 jpm 228
 
3638 delphine 229
                        $retour[$projet]['champs-supp'][$key]['name'] = $this->clean_string( $chsup['name'] );
230
                        $retour[$projet]['champs-supp'][$key]['description'] = $this->clean_string( $chsup['description']);
231
                        $retour[$projet]['champs-supp'][$key]['unit'] = $this->clean_string( $chsup['unit'] );
2848 mathias 232
 
3638 delphine 233
                        if ( isset( $chsup['fieldValues'] ) ) {
234
                                $retour[$projet]['champs-supp'][$key]['fieldValues'] = json_decode( $this->clean_string( $chsup['fieldValues'] ), true );
3037 mathias 235
 
3638 delphine 236
                                if ( isset( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] ) ) {
237
                                        foreach( $retour[$projet]['champs-supp'][$key]['fieldValues']['listValue'] as $list_key => $list_value_array ) {
238
                                                // Obtenir une liste de valeurs utilisables dans les attributs for id ou name par exemple
239
                                                $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] ) ) ) : '';
240
                                        }
241
                                }
242
                        }
243
                        $retour[$projet]['champs-supp'][$key]['mandatory'] = intval( $chsup['mandatory'] );
1536 jpm 244
                }
3638 delphine 245
                return $retour;
246
        }
2406 jpm 247
 
3638 delphine 248
        // remplace certains parametres définis en bd par les parametres définis dans l'url
249
        private function traiterParametres($estProjetDefini, $tableau) {
250
                $criteres = array('tag-obs', 'tag-img', 'projet', 'titre', 'logo');
251
                $criteresProjetNonDefini = array('commune', 'num_nom', 'referentiel');
252
                foreach($this->parametres as $nom_critere => $valeur_critere) {
253
                        if (($estProjetDefini == false || $tableau['projet'] == 'base') && in_array($nom_critere, $criteresProjetNonDefini)) {
254
                                $tableau[$nom_critere] = $valeur_critere;
255
                        } else if (in_array($nom_critere, $criteres)) {
256
                                $tableau[$nom_critere] = $valeur_critere;
2328 jpm 257
                        }
2406 jpm 258
                }
3638 delphine 259
                return $tableau;
719 jpm 260
        }
1526 jpm 261
 
3638 delphine 262
        private function traiterLocalisation( $infos_localisation ) {
263
                $infos = explode(';', $infos_localisation);
264
                $tableauTmp = array();
265
                $retour = array();
266
                foreach ($infos as $info) {
267
                        $tableauTmp = explode(':', $info);
268
                        $retour[$tableauTmp[0]] = $tableauTmp[1];
2408 jpm 269
                }
3638 delphine 270
                return $retour;
1475 aurelien 271
        }
1050 jpm 272
 
3638 delphine 273
        private function traiterParamsLocalisation( $params ) {
274
                $infos = array();
275
                $tableauTmp = array();
276
                $zoom = '12';
277
                if (isset($params['commune'])) {
278
                        $url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD). '?zone='.$params['commune'].'&code='.$params['dept'];
279
                } else if (isset($params['dept'])) {
280
                        // pas trouvé de manière simple de déterminer le centroïde du département
281
                        // du coup on retrouve le code insee du chef lieu
282
                        $params['code_insee'] = $this->recupererChefLieuDept($params['dept']);
283
                        $zoom = '9';
2851 mathias 284
                }
3638 delphine 285
                // quoi qu'il arrive, s'il est défini, on donne la priorité au code insee (plus précis)
286
                if (isset($params['code_insee'])) {
287
                        $url = sprintf($this->config['chemins']['baseURLServicesCelTpl'], self::WS_COORD). '?code='.$params['code_insee'];
2851 mathias 288
                }
3638 delphine 289
                if(!empty($url)) $json = $this->getDao()->consulter($url);
290
                if(!empty($json)) $infos = json_decode($json, true);
291
                if(!empty($infos)) {
292
                        $infos['lat'] = str_replace(',','.',strval(round($infos['lat'],5)));
293
                        $infos['lng'] = str_replace(',','.',strval(round($infos['lng'],5)));
294
                        return 'latitude:'.$infos['lat'].';longitude:'.$infos['lng'].';zoom:'.$zoom;
295
                } else {
296
                        return false;
2851 mathias 297
                }
298
        }
2916 mathias 299
 
3638 delphine 300
        private function rechercherInfosEspeces( $infos_projets ) {
301
                $retour = array();
302
                $referentiel = $infos_projets['referentiel'];
303
                $urlWsNsTpl = $this->config['chemins']['baseURLServicesEfloreTpl'];
304
                $retour['url_ws_autocompletion_ns'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, $referentiel, self::WS_NOM );;
305
                $retour['url_ws_autocompletion_ns_tpl'] = sprintf( $urlWsNsTpl, self::EFLORE_API_VERSION, '{referentiel}', self::WS_NOM );
306
                $retour['ns_referentiel'] = $referentiel;
307
 
308
                if ( isset( $infos_projets['type_especes'] ) ) {
309
 
310
                        switch ( $infos_projets['type_especes'] ) {
311
                                case 'fixe' :
312
                                        $info_taxon = explode(':', $referentiel);
313
                                        if (!empty($info_taxon) && count((array) $info_taxon) === 2) {
314
                                                $retour = $this->chargerInfosTaxon( $info_taxon[0], $info_taxon[1] );
315
                                        }
316
                                        break;
317
                                case 'referentiel' : break;
318
                                case 'liste' :
3898 delphine 319
                                case 'liste+autre' :
3638 delphine 320
                                        $retour['taxons'] = $this->recupererListeNomsSci();
321
                                        break;
322
                        }
323
                } else if ( isset( $referentiel ) ) {
324
                        if ( isset($infos_projets['num_nom'] ) ) {
325
                                $retour = $this->chargerInfosTaxon( $referentiel, $infos_projets['num_nom'] );
326
                        }
2916 mathias 327
                }
3638 delphine 328
                return $retour;
2916 mathias 329
        }
330
 
3638 delphine 331
        /**
332
         * Consulte un webservice pour obtenir des informations sur le taxon dont le
333
         * numéro nomenclatural est $num_nom (ce sont donc plutôt des infos sur le nom
334
         * et non le taxon?)
335
         * @param string|int $num_nom
336
         * @return array
337
         */
338
        protected function chargerInfosTaxon( $referentiel, $num_nom ) {
339
                $url_service_infos = sprintf( $this->config['chemins']['infosTaxonUrl'], $referentiel, $num_nom );
340
                $infos = json_decode( file_get_contents( $url_service_infos ) );
341
                // trop de champs injectés dans les infos espèces peuvent
342
                // faire planter javascript
343
                $champs_a_garder = array( 'id', 'nom_sci','nom_sci_complet', 'nom_complet', 'famille','nom_retenu.id', 'nom_retenu_complet', 'num_taxonomique' );
344
                $resultat = array();
345
                $retour = array();
346
                if ( isset( $infos ) && !empty( $infos ) ) {
347
                        $infos = (array) $infos;
348
                        if ( isset( $infos['nom_sci'] ) && $infos['nom_sci'] !== '' ) {
349
                                $resultat = array_intersect_key( $infos, array_flip($champs_a_garder ) );
350
                                $resultat['retenu'] = ( $infos['id'] == $infos['nom_retenu.id'] ) ? 'true' : 'false';
351
                                $retour['espece_imposee'] = true;
352
                                $retour['nn_espece_defaut'] = $nnEspeceImposee;
353
                                $retour['nom_sci_espece_defaut'] = $resultat['nom_complet'];
354
                                $retour['infos_espece'] = $this->array2js( $resultat, true );
355
                        }
2906 aurel 356
                }
3638 delphine 357
                return $retour;
2906 aurel 358
        }
2851 mathias 359
 
360
        protected function getReferentielImpose() {
2869 mathias 361
                $referentiel_impose = true;
3638 delphine 362
                if (!empty($_GET['referentiel']) && $_GET['referentiel'] !== 'autre') {
2851 mathias 363
                        $this->ns_referentiel = $_GET['referentiel'];
2869 mathias 364
                } else if (isset($this->configProjet['referentiel'])) {
365
                        $this->ns_referentiel = $this->configProjet['referentiel'];
366
                } else if (isset($this->configMission['referentiel'])) {
367
                        $this->ns_referentiel = $this->configMission['referentiel'];
368
                } else {
369
                        $referentiel_impose = false;
2851 mathias 370
                }
371
                return $referentiel_impose;
372
        }
373
 
2688 mathias 374
        /**
3638 delphine 375
         * Trie par nom français les taxons lus dans le fichier csv/tsv
2805 mathias 376
         */
2688 mathias 377
        protected function recupererListeNomsSci() {
1613 jpm 378
                $taxons = $this->recupererListeTaxon();
379
                if (is_array($taxons)) {
380
                        $taxons = self::trierTableauMd($taxons, array('nom_fr' => SORT_ASC));
381
                }
1629 jpm 382
                return $taxons;
1613 jpm 383
        }
384
 
2688 mathias 385
        /**
386
         * @TODO documenter
387
         * @return array
388
         */
389
        protected function recupererListeNoms() {
1613 jpm 390
                $taxons = $this->recupererListeTaxon();
391
                $nomsAAfficher = array();
392
                $nomsSpeciaux = array();
393
                if (is_array($taxons)) {
394
                        foreach ($taxons as $taxon) {
395
                                $nomSciTitle = $taxon['nom_ret'].
3638 delphine 396
                                ($taxon['nom_fr'] != '' ? ' - '.$taxon['nom_fr'] : '' ).
397
                                ($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
1613 jpm 398
                                $nomFrTitle = $taxon['nom_sel'].
3638 delphine 399
                                ($taxon['nom_ret'] != $taxon['nom_sel']? ' - '.$taxon['nom_ret'] : '' ).
400
                                ($taxon['nom_fr_autre'] != '' ? ' - '.$taxon['nom_fr_autre'] : '' );
1613 jpm 401
 
402
                                if ($taxon['groupe'] == 'special') {
403
                                        $nomsSpeciaux[] = array(
3638 delphine 404
                                                        'num_nom' => $taxon['num_nom_sel'],
405
                                                        'nom_a_afficher' => $taxon['nom_fr'],
406
                                                        'nom_a_sauver' => $taxon['nom_sel'],
407
                                                        'nom_title' => $nomSciTitle,
408
                                                        'nom_type' => 'nom-special');
1613 jpm 409
                                } else {
410
                                        $nomsAAfficher[] = array(
3638 delphine 411
                                                        'num_nom' => $taxon['num_nom_sel'],
412
                                                        'nom_a_afficher' => $taxon['nom_sel'],
413
                                                        'nom_a_sauver' => $taxon['nom_sel'],
414
                                                        'nom_title' => $nomSciTitle,
415
                                                        'nom_type' => 'nom-sci');
1613 jpm 416
                                        $nomsAAfficher[] = array(
3638 delphine 417
                                                        'num_nom' => $taxon['num_nom_sel'],
418
                                                        'nom_a_afficher' => $taxon['nom_fr'],
419
                                                        'nom_a_sauver' => $taxon['nom_fr'],
420
                                                        'nom_title' => $nomFrTitle,
421
                                                        'nom_type' => 'nom-fr');
1613 jpm 422
                                }
423
                        }
424
                        $nomsAAfficher = self::trierTableauMd($nomsAAfficher, array('nom_a_afficher' => SORT_ASC));
425
                        $nomsSpeciaux = self::trierTableauMd($nomsSpeciaux, array('nom_a_afficher' => SORT_ASC));
426
                }
427
                return array('speciaux' => $nomsSpeciaux, 'sci-et-fr' => $nomsAAfficher);
428
        }
2328 jpm 429
 
2688 mathias 430
        /**
3638 delphine 431
         * Lit une liste de taxons depuis un fichier csv ou tsv fourni
2688 mathias 432
         */
433
        protected function recupererListeTaxon() {
434
                $taxons = array();
3638 delphine 435
                $langue_projet_url = ( isset ( $this->parametres['langue'] ) && $this->parametres['langue'] !== 'fr' ) ? '_' . $this->parametres['langue'] : '';
436
                $chemin_images = dirname(__FILE__) . self::DS . '..' . self::DS . 'manager' . self::DS . 'squelettes' . self::DS . 'img' . self::DS . 'images_projets' . self::DS;
437
                $nom_fichier = ($this->parametres['squelette'] === 'lichens') ? 'lichens_taxons' : 'especes';
438
                $chemin_taxon = $chemin_images . $this->parametres['projet'] . $langue_projet_url . self::DS . $nom_fichier. '.';
439
 
440
                if ( file_exists( $chemin_taxon . 'csv' ) && is_readable( $chemin_taxon . 'csv' ) ) {
441
                        $taxons = $this->decomposerFichierCsv( $chemin_taxon . 'csv' );
442
                } else if ( file_exists( $chemin_taxon . 'tsv' ) && is_readable( $chemin_taxon . 'tsv' ) ) {
443
                        $taxons = $this->decomposerFichierCsv( $chemin_taxon . 'tsv' );
3017 delphine 444
                } else {
3638 delphine 445
                        $this->debug[] = "Impossible d'ouvrir le fichier '$nom_fichier'.";
446
                }
447
                return $taxons;
448
        }
449
 
450
        /**
451
         * Lit une liste de taxons depuis un fichier csv ou tsv fourni
452
         */
453
        protected function recupererChefLieuDept($dept) {
454
                $infosDepts = array();
455
                $code_insee = '';
456
                $chemin_fichier = dirname(__FILE__).self::DS.'squelettes'.self::DS.'dept.csv';
457
 
458
                if (file_exists($chemin_fichier ) && is_readable($chemin_fichier)) {
459
                        $infosDepts = $this->decomposerFichierCsv( $chemin_fichier,"," );
460
                        if(!empty($infosDepts) && is_array($infosDepts)) {
461
                                foreach ($infosDepts as $key => $infosDept) {
462
                                        if($dept == $infosDept['dep']) {
463
                                                return $code_insee = $infosDept['cheflieu'];
464
                                        }
465
                                }
3042 mathias 466
                        }
2328 jpm 467
                } else {
3844 idir 468
                        $this->debug[] = "Impossible d'ouvrir le fichier '$chemin_fichier'.";
2328 jpm 469
                }
712 jpm 470
        }
1050 jpm 471
 
2688 mathias 472
        /**
3638 delphine 473
         * Découpe un fihcier csv/tsv
2688 mathias 474
         */
3638 delphine 475
        protected function decomposerFichierCsv($fichier, $delimiter = "\t"){
2328 jpm 476
                $header = null;
477
                $data = array();
3638 delphine 478
                if (($handle = fopen($fichier, "r")) !== FALSE) {
2328 jpm 479
                        while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) {
480
                                if (!$header) {
481
                                        $header = $row;
482
                                } else {
483
                                        $data[] = array_combine($header, $row);
484
                                }
485
                        }
486
                        fclose($handle);
487
                }
488
                return $data;
489
        }
490
 
2688 mathias 491
        /**
492
         * Convertit un tableau PHP en Javascript - @WTF pourquoi ne pas faire un json_encode ?
493
         * @param array $array
494
         * @param boolean $show_keys
495
         * @return une portion de JSON représentant le tableau
496
         */
497
        protected function array2js($array,$show_keys) {
1536 jpm 498
                $tableauJs = '{}';
499
                if (!empty($array)) {
500
                        $total = count($array) - 1;
501
                        $i = 0;
502
                        $dimensions = array();
503
                        foreach ($array as $key => $value) {
504
                                if (is_array($value)) {
505
                                        $dimensions[$i] = array2js($value,$show_keys);
506
                                        if ($show_keys) {
3638 delphine 507
                                                $dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
1536 jpm 508
                                        }
509
                                } else {
3638 delphine 510
                                        $dimensions[$i] = '\"'.addslashes($value).'\"';
1536 jpm 511
                                        if ($show_keys) {
3638 delphine 512
                                                $dimensions[$i] = '\"'.$key.'\":'.$dimensions[$i];
1536 jpm 513
                                        }
1526 jpm 514
                                }
1536 jpm 515
                                if ($i == 0) {
516
                                        $dimensions[$i] = '{'.$dimensions[$i];
1526 jpm 517
                                }
1536 jpm 518
                                if ($i == $total) {
519
                                        $dimensions[$i].= '}';
520
                                }
521
                                $i++;
1526 jpm 522
                        }
1536 jpm 523
                        $tableauJs = implode(',', $dimensions);
1526 jpm 524
                }
1536 jpm 525
                return $tableauJs;
1526 jpm 526
        }
2906 aurel 527
}
3638 delphine 528
?>