source: spip-zone/_plugins_/rainette/trunk/rainette_fonctions.php @ 77022

Last change on this file since 77022 was 77022, checked in by eric@…, 6 years ago

Report de la correction de la fonction rainette_afficher_direction() avec gestion de la direction variable

File size: 11.5 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5if (!defined('_RAINETTE_ICONES_PATH'))
6        define ('_RAINETTE_ICONES_PATH','rainette/');
7
8// Balises du plugin utilisables dans les squelettes et modeles
9function balise_RAINETTE_INFOS($p) {
10
11        $code_meteo = interprete_argument_balise(1,$p);
12        $code_meteo = isset($code_meteo) ? str_replace('\'', '"', $code_meteo) : '""';
13        $type_info = interprete_argument_balise(2,$p);
14        $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '""';
15        $service = interprete_argument_balise(3,$p);
16        $service = isset($service) ? str_replace('\'', '"', $service) : '"weather"';
17
18        $p->code = 'calculer_infos('.$code_meteo.', '.$type_info.', '.$service.')';
19        $p->interdire_scripts = false;
20        return $p;
21}
22
23function calculer_infos($lieu, $type, $service) {
24
25        // Traitement des cas ou les arguments sont vides
26        if (!$lieu) return '';
27        if (!$service) $service = 'weather';
28
29        $charger = charger_fonction('charger_meteo', 'inc');
30        $nom_fichier = $charger($lieu, 'infos', $service);
31        lire_fichier($nom_fichier,$tableau);
32        if (!isset($type) OR !$type)
33                return $tableau;
34        else {
35                $tableau = unserialize($tableau);
36                $info = $tableau[strtolower($type)];
37                return $info;
38        }
39}
40
41// Filtres du plugin utilisables dans les squelettes et modeles
42function rainette_icone_meteo($icone, $taille='petit', $service='weather', $chemin='', $extension="png"){
43
44        $html_icone = '';
45
46        if (is_array($icone)) {
47                // Utilisation des icones natifs des services autres que weather.com
48                list ($l,$h) = @getimagesize($icone['url']);
49                $html_icone = '<img src="'.$icone['url'].'" alt="etat meteo" title="'.rainette_resume_meteo($icone['code']).'" width="'.$l.'" height="'.$h.'" />';
50        }
51        else {
52                // Utilisation des icones weather.com
53                $icone = ($icone AND (($icone >= 0) AND ($icone < 48))) ? strval($icone) : 'na';
54                if (!$chemin) $chemin = _RAINETTE_ICONES_PATH.$taille.'/';
55
56                // Le dossier personnalise ou le dossier passe en argument a bien l'icone requise
57                if ($img = find_in_path($chemin.$icone.'.'.$extension)) {
58                        list ($l,$h) = @getimagesize($img);
59                        $html_icone = '<img src="'.$img.'" alt="etat meteo" title="'.rainette_resume_meteo($icone).'" width="'.$l.'" height="'.$h.'" />';
60                }
61                // Le dossier personnalise n'a pas d'image, on prend l'icone par defaut dans le repertoire img_meteo/
62                elseif (($chemin = 'img_meteo/'.$taille.'/') && ($img = find_in_path($chemin.$icone.'.'.$extension))) {
63                        list ($l,$h) = @getimagesize($img);
64                        $html_icone = '<img src="'.$img.'" alt="etat meteo" title="'.rainette_resume_meteo($icone).'" width="'.$l.'" height="'.$h.'" />';
65                }
66        }
67
68        return $html_icone;
69}
70
71function rainette_resume_meteo($meteo) {
72
73        if (is_numeric($meteo)) {
74                // On utilise l'option de _T permettant de savoir si un item existe ou pas
75                $resume = _T('rainette:meteo_' . $meteo, array(), array('force' => false));
76                if (!$resume)
77                        $resume = _T('rainette:meteo_na') . " ($meteo)";
78        }
79        else
80                $resume = $meteo ? $meteo : _T('rainette:meteo_na');
81
82        return ucfirst($resume);
83}
84
85/**
86 * Conversion une indication de direction en une chaine traduite pour
87 * l'affichage dans les modèles.
88 *
89 * @param       mixed   $direction
90 *              La direction soit sous forme d'une valeur numérique entre 0 et 360, soit sous forme
91 *              d'une chaine. Certains services utilisent la chaine "V" pour indiquer une direction
92 *              variable.
93 * @return      string
94 *              La chaine traduite indiquant la direction du vent.
95 */
96function rainette_afficher_direction($direction) {
97        static $liste_direction = array(
98                0 => 'N',
99                1 => 'NNE',
100                2 => 'NE',
101                3 => 'ENE',
102                4 => 'E',
103                5 => 'ESE',
104                6 => 'SE',
105                7 => 'SSE',
106                8 => 'S',
107                9 => 'SSW',
108                10 => 'SW',
109                11 => 'WSW',
110                12 => 'W',
111                13 => 'WNW',
112                14 => 'NW',
113                15 => 'NNW',
114                16 => 'N',
115                17 => 'V'
116        );
117
118        if (is_int($direction))
119                $direction = $liste_direction[round($direction / 22.5) % 16];
120        elseif (!in_array($direction, $liste_direction))
121                return _T('rainette:valeur_indeterminee');
122        return _T('rainette:direction_'.$direction);
123}
124
125function rainette_afficher_tendance($tendance_en, $methode='texte', $chemin='', $extension="png"){
126        $html = '';
127
128        if ($methode == 'texte') {
129                $html = _T('rainette:tendance_texte_'.$tendance_en);
130        }
131        else if ($methode == 'symbole') {
132                $html = _T('rainette:tendance_symbole_'.$tendance_en);
133        }
134        else if ($methode == 'icone') {
135                if (!$chemin) $chemin = _RAINETTE_ICONES_PATH;
136
137                // Le dossier personnalise ou le dossier passe en argument a bien l'icone requise
138                if ($img = find_in_path($chemin.$tendance_en.'.'.$extension)) {
139                        list ($l,$h) = @getimagesize($img);
140                        $html = '<img src="'.$img.'" alt="'._T('rainette:tendance_texte_'.$tendance_en).'" title="'._T('rainette:tendance_texte_'.$tendance_en).'" width="'.$l.'" height="'.$h.'" />';
141                }
142                // Le dossier personnalise n'a pas d'image, on prend l'icone par defaut dans le repertoire img_meteo/
143                elseif (($chemin = 'img_meteo/') && ($img = find_in_path($chemin.$tendance_en.'.'.$extension))) {
144                        list ($l,$h) = @getimagesize($img);
145                        $html = '<img src="'.$img.'" alt="'._T('rainette:tendance_texte_'.$tendance_en).'" title="'._T('rainette:tendance_texte_'.$tendance_en).'" width="'.$l.'" height="'.$h.'" />';
146                }
147        }
148        return $html;
149}
150
151/**
152 * Affiche toute donnée météorologique au format numérique avec son unité.
153 *
154 *
155 * @package     RAINETTE/AFFICHAGE
156 * @api
157 *
158 * @param int/float     $valeur                 La valeur à afficher
159 * @param string        $type_valeur    Type de données à afficher parmi 'temperature', 'pourcentage', 'angle', 'pression', 'distance', 'vitesse', 'population'
160 * @param int           $precision              Nombre de décimales à afficher pour les réels uniquement ou -1 pour utiliser le défaut
161 *
162 * @return string       La chaine calculée ou le texte désignant une valeur indéterminée
163 */
164function rainette_afficher_unite($valeur, $type_valeur='', $precision=-1) {
165
166        static $precision_defaut = array(
167                                                'pression' => 1,
168                                                'distance' => 1,
169                                                'angle' => 0,
170                                                'vitesse' => 0);
171
172        if (!$service) $service = 'weather';
173        include_spip('inc/config');
174        $unite = lire_config("rainette/${service}/unite", 'm');
175
176        $valeur_affichee = _T('rainette:valeur_indeterminee');
177        if ($valeur) {
178                // Détermination de l'arrondi si la donnée est stockée sous format réel
179                if (array_key_exists($type_valeur, $precision_defaut)) {
180                        $precision = ($precision < 0) ? $precision_defaut[$type_valeur] : $precision;
181                        $valeur = round($valeur, $precision);
182                }
183                $suffixe = ($type_valeur == 'population')
184                                        ? ''
185                                        : (($unite == 'm') ? 'metrique' : 'standard');
186                $espace = (($type_valeur == 'temperature') ||
187                                   ($type_valeur == 'pourcentage') || ($type_valeur == 'angle')) ? '' : '&nbsp;';
188                $item = 'rainette:unite_' . $type_valeur . ($suffixe ? '_' . $suffixe : '');
189                $valeur_affichee = strval($valeur) . $espace . _T($item);
190        }
191        return $valeur_affichee;
192}
193
194/**
195 * Charger le fichier des infos meteos jour par jour
196 * et rendre l'affichage pour les N premiers jours
197 *
198 * @param string $lieu
199 * @param int $nb_jours_affiche
200 * @return string
201 */
202function rainette_coasser_previsions($lieu, $type='1_jour', $jour=0, $modele='previsions_2x12h', $service='weather'){
203
204        // Recuperation du tableau des prévisions pour tous les jours disponibles
205        $charger = charger_fonction('charger_meteo', 'inc');
206        $nom_fichier = $charger($lieu, 'previsions', $service);
207        lire_fichier($nom_fichier,$tableau);
208        $tableau = unserialize($tableau);
209
210        // Détermination de l'index final contenant les extra (erreur, date...)
211        $index_extra = count($tableau) - 1;
212
213        // On ajoute le lieu, le mode et le service au contexte fourni au modele
214        $tableau[$index_extra]['lieu'] = $lieu;
215        $tableau[$index_extra]['mode'] = 'previsions';
216        $tableau[$index_extra]['service'] = $service;
217
218        if (($tableau[$index_extra]['erreur'])) {
219                // Affichage du message d'erreur
220                $texte = recuperer_fond("modeles/erreur", $tableau[$index_extra]);
221        }
222        else {
223                if ($type == '1_jour') {
224                        // Dans ce cas la variable $jour indique le numéro du jour demandé (0 pour aujourd'hui)
225                        // Plutôt que de renvoyer une erreur si le numéro du jour est supérieur au nombre de jours en prévisions
226                        // on renvoie au moins le jour max
227                        $index_jour = min($jour, $index_extra-1);
228
229                        // Si jour=0 (aujourd'hui), on complete par le tableau du lendemain matin
230                        // afin de gérer le passage des prévisions jour à celles de la nuit
231                        if ($index_jour == 0) {
232                                $tableau[$index_jour]['lever_soleil_demain'] = $tableau[$index_jour+1]['lever_soleil'];
233                                $tableau[$index_jour]['temperature_demain'] = $tableau[$index_jour+1]['temperature_jour'];
234                                $tableau[$index_jour]['code_icone_demain'] = $tableau[$index_jour+1]['code_icone_jour'];
235                                $tableau[$index_jour]['vitesse_vent_demain'] = $tableau[$index_jour+1]['vitesse_vent_jour'];
236                                $tableau[$index_jour]['angle_vent_demain'] = $tableau[$index_jour+1]['angle_vent_jour'];
237                                $tableau[$index_jour]['direction_vent_demain'] = $tableau[$index_jour+1]['direction_vent_jour'];
238                                $tableau[$index_jour]['risque_precipitation_demain'] = $tableau[$index_jour+1]['risque_precipitation_jour'];
239                                $tableau[$index_jour]['humidite_demain'] = $tableau[$index_jour+1]['humidite_jour'];
240                        }
241
242                        // On ajoute les informations extra (date et crédits)
243                        $contexte = array_merge($tableau[$index_jour], $tableau[$index_extra]);
244                        $texte = recuperer_fond("modeles/$modele", $contexte);
245                }
246                else if ($type == 'x_jours') {
247                        if ($jour == 0) $jour = $index_extra;
248                        $nb_jours = min($jour, $index_extra);
249
250                        $texte = "";
251                        for ($i = 0; $i < $nb_jours; $i++) {
252                                $contexte = array_merge($tableau[$i], $tableau[$index_extra]);
253                                $texte .= recuperer_fond("modeles/$modele", $contexte);
254                        }
255                }
256        }
257
258        return $texte;
259}
260
261function rainette_coasser_conditions($lieu, $modele='conditions_tempsreel', $service='weather'){
262
263        // Recuperation du tableau des conditions courantes
264        $charger = charger_fonction('charger_meteo', 'inc');
265        $nom_fichier = $charger($lieu, 'conditions', $service);
266        lire_fichier($nom_fichier,$tableau);
267        $tableau = unserialize($tableau);
268
269        // On ajoute le lieu, le mode et le service au contexte fourni au modele
270        $tableau['lieu'] = $lieu;
271        $tableau['mode'] = 'conditions';
272        $tableau['service'] = $service;
273
274        if ($tableau['erreur'])
275                $texte = recuperer_fond("modeles/erreur", $tableau);
276        else
277                $texte = recuperer_fond("modeles/$modele", $tableau);
278
279        return $texte;
280}
281
282function rainette_coasser_infos($lieu, $modele='infos_ville', $service='weather'){
283
284        // Recuperation du tableau des conditions courantes
285        $charger = charger_fonction('charger_meteo', 'inc');
286        $nom_fichier = $charger($lieu, 'infos', $service);
287        lire_fichier($nom_fichier,$tableau);
288        $tableau = unserialize($tableau);
289
290        // On ajoute le lieu, le mode et le service au contexte fourni au modele
291        $tableau['lieu'] = $lieu;
292        $tableau['mode'] = 'infos';
293        $tableau['service'] = $service;
294
295        if ($tableau['erreur'])
296                $texte = recuperer_fond("modeles/erreur", $tableau);
297        else
298                $texte = recuperer_fond("modeles/$modele", $tableau);
299
300        return $texte;
301}
302
303function rainette_debug($lieu, $mode='previsions', $service='weather') {
304
305        // Recuperation du tableau des conditions courantes
306        $charger = charger_fonction('charger_meteo', 'inc');
307        $nom_fichier = $charger($lieu, $mode, $service);
308        if ($nom_fichier) {
309                lire_fichier($nom_fichier,$tableau);
310                $tableau = unserialize($tableau);
311
312                // On ajoute le lieu, le mode et le service au contexte fourni au modele
313                if ($mode == 'previsions') {
314                        // Pour les prévisions les informations communes sont stockées dans un index supplémentaire en fin de tableau
315                        $index = count($tableau)-1;
316                        $tableau[$index]['lieu'] = $lieu;
317                        $tableau[$index]['mode'] = $mode;
318                        $tableau[$index]['service'] = $service;
319                }
320                else {
321                        $tableau['lieu'] = $lieu;
322                        $tableau['mode'] = $mode;
323                        $tableau['service'] = $service;
324                }
325
326                var_dump($tableau);
327        }
328}
329
330?>
Note: See TracBrowser for help on using the repository browser.