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

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

Correction du modèle infos_ville.
Utilisation de la nouvelle fonction simplexml_to_array().
Correction de rainette_afficher_direction() : il ne faut pas supprimer la fonction angle2direction() qui est utiliser par certains services.

File size: 11.2 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
98        include_spip('inc/convertir');
99        $direction = angle2direction($direction);
100
101        if ($direction)
102                return _T('rainette:direction_'.$direction);
103        else
104                return _T('rainette:valeur_indeterminee');
105}
106
107function rainette_afficher_tendance($tendance_en, $methode='texte', $chemin='', $extension="png"){
108        $html = '';
109
110        if ($methode == 'texte') {
111                $html = _T('rainette:tendance_texte_'.$tendance_en);
112        }
113        else if ($methode == 'symbole') {
114                $html = _T('rainette:tendance_symbole_'.$tendance_en);
115        }
116        else if ($methode == 'icone') {
117                if (!$chemin) $chemin = _RAINETTE_ICONES_PATH;
118
119                // Le dossier personnalise ou le dossier passe en argument a bien l'icone requise
120                if ($img = find_in_path($chemin.$tendance_en.'.'.$extension)) {
121                        list ($l,$h) = @getimagesize($img);
122                        $html = '<img src="'.$img.'" alt="'._T('rainette:tendance_texte_'.$tendance_en).'" title="'._T('rainette:tendance_texte_'.$tendance_en).'" width="'.$l.'" height="'.$h.'" />';
123                }
124                // Le dossier personnalise n'a pas d'image, on prend l'icone par defaut dans le repertoire img_meteo/
125                elseif (($chemin = 'img_meteo/') && ($img = find_in_path($chemin.$tendance_en.'.'.$extension))) {
126                        list ($l,$h) = @getimagesize($img);
127                        $html = '<img src="'.$img.'" alt="'._T('rainette:tendance_texte_'.$tendance_en).'" title="'._T('rainette:tendance_texte_'.$tendance_en).'" width="'.$l.'" height="'.$h.'" />';
128                }
129        }
130        return $html;
131}
132
133/**
134 * Affiche toute donnée météorologique au format numérique avec son unité.
135 *
136 *
137 * @package     RAINETTE/AFFICHAGE
138 * @api
139 *
140 * @param int/float     $valeur                 La valeur à afficher
141 * @param string        $type_valeur    Type de données à afficher parmi 'temperature', 'pourcentage', 'angle', 'pression', 'distance', 'vitesse', 'population'
142 * @param int           $precision              Nombre de décimales à afficher pour les réels uniquement ou -1 pour utiliser le défaut
143 *
144 * @return string       La chaine calculée ou le texte désignant une valeur indéterminée
145 */
146function rainette_afficher_unite($valeur, $type_valeur='', $precision=-1) {
147
148        static $precision_defaut = array(
149                                                'pression' => 1,
150                                                'distance' => 1,
151                                                'angle' => 0,
152                                                'vitesse' => 0);
153
154        if (!$service) $service = 'weather';
155        include_spip('inc/config');
156        $unite = lire_config("rainette/${service}/unite", 'm');
157
158        $valeur_affichee = _T('rainette:valeur_indeterminee');
159        if ($valeur) {
160                // Détermination de l'arrondi si la donnée est stockée sous format réel
161                if (array_key_exists($type_valeur, $precision_defaut)) {
162                        $precision = ($precision < 0) ? $precision_defaut[$type_valeur] : $precision;
163                        $valeur = round($valeur, $precision);
164                }
165                $suffixe = ($type_valeur == 'population')
166                                        ? ''
167                                        : (($unite == 'm') ? 'metrique' : 'standard');
168                $espace = (($type_valeur == 'temperature') ||
169                                   ($type_valeur == 'pourcentage') || ($type_valeur == 'angle')) ? '' : '&nbsp;';
170                $item = 'rainette:unite_' . $type_valeur . ($suffixe ? '_' . $suffixe : '');
171                $valeur_affichee = strval($valeur) . $espace . _T($item);
172        }
173        return $valeur_affichee;
174}
175
176/**
177 * Charger le fichier des infos meteos jour par jour
178 * et rendre l'affichage pour les N premiers jours
179 *
180 * @param string $lieu
181 * @param int $nb_jours_affiche
182 * @return string
183 */
184function rainette_coasser_previsions($lieu, $type='1_jour', $jour=0, $modele='previsions_2x12h', $service='weather'){
185
186        // Recuperation du tableau des prévisions pour tous les jours disponibles
187        $charger = charger_fonction('charger_meteo', 'inc');
188        $nom_fichier = $charger($lieu, 'previsions', $service);
189        lire_fichier($nom_fichier,$tableau);
190        $tableau = unserialize($tableau);
191
192        // Détermination de l'index final contenant les extra (erreur, date...)
193        $index_extra = count($tableau) - 1;
194
195        // On ajoute le lieu, le mode et le service au contexte fourni au modele
196        $tableau[$index_extra]['lieu'] = $lieu;
197        $tableau[$index_extra]['mode'] = 'previsions';
198        $tableau[$index_extra]['service'] = $service;
199
200        if (($tableau[$index_extra]['erreur'])) {
201                // Affichage du message d'erreur
202                $texte = recuperer_fond("modeles/erreur", $tableau[$index_extra]);
203        }
204        else {
205                if ($type == '1_jour') {
206                        // Dans ce cas la variable $jour indique le numéro du jour demandé (0 pour aujourd'hui)
207                        // Plutôt que de renvoyer une erreur si le numéro du jour est supérieur au nombre de jours en prévisions
208                        // on renvoie au moins le jour max
209                        $index_jour = min($jour, $index_extra-1);
210
211                        // Si jour=0 (aujourd'hui), on complete par le tableau du lendemain matin
212                        // afin de gérer le passage des prévisions jour à celles de la nuit
213                        if ($index_jour == 0) {
214                                $tableau[$index_jour]['lever_soleil_demain'] = $tableau[$index_jour+1]['lever_soleil'];
215                                $tableau[$index_jour]['temperature_demain'] = $tableau[$index_jour+1]['temperature_jour'];
216                                $tableau[$index_jour]['code_icone_demain'] = $tableau[$index_jour+1]['code_icone_jour'];
217                                $tableau[$index_jour]['vitesse_vent_demain'] = $tableau[$index_jour+1]['vitesse_vent_jour'];
218                                $tableau[$index_jour]['angle_vent_demain'] = $tableau[$index_jour+1]['angle_vent_jour'];
219                                $tableau[$index_jour]['direction_vent_demain'] = $tableau[$index_jour+1]['direction_vent_jour'];
220                                $tableau[$index_jour]['risque_precipitation_demain'] = $tableau[$index_jour+1]['risque_precipitation_jour'];
221                                $tableau[$index_jour]['humidite_demain'] = $tableau[$index_jour+1]['humidite_jour'];
222                        }
223
224                        // On ajoute les informations extra (date et crédits)
225                        $contexte = array_merge($tableau[$index_jour], $tableau[$index_extra]);
226                        $texte = recuperer_fond("modeles/$modele", $contexte);
227                }
228                else if ($type == 'x_jours') {
229                        if ($jour == 0) $jour = $index_extra;
230                        $nb_jours = min($jour, $index_extra);
231
232                        $texte = "";
233                        for ($i = 0; $i < $nb_jours; $i++) {
234                                $contexte = array_merge($tableau[$i], $tableau[$index_extra]);
235                                $texte .= recuperer_fond("modeles/$modele", $contexte);
236                        }
237                }
238        }
239
240        return $texte;
241}
242
243function rainette_coasser_conditions($lieu, $modele='conditions_tempsreel', $service='weather'){
244
245        // Recuperation du tableau des conditions courantes
246        $charger = charger_fonction('charger_meteo', 'inc');
247        $nom_fichier = $charger($lieu, 'conditions', $service);
248        lire_fichier($nom_fichier,$tableau);
249        $tableau = unserialize($tableau);
250
251        // On ajoute le lieu, le mode et le service au contexte fourni au modele
252        $tableau['lieu'] = $lieu;
253        $tableau['mode'] = 'conditions';
254        $tableau['service'] = $service;
255
256        if ($tableau['erreur'])
257                $texte = recuperer_fond("modeles/erreur", $tableau);
258        else
259                $texte = recuperer_fond("modeles/$modele", $tableau);
260
261        return $texte;
262}
263
264function rainette_coasser_infos($lieu, $modele='infos_ville', $service='weather'){
265
266        // Recuperation du tableau des conditions courantes
267        $charger = charger_fonction('charger_meteo', 'inc');
268        $nom_fichier = $charger($lieu, 'infos', $service);
269        lire_fichier($nom_fichier,$tableau);
270        $tableau = unserialize($tableau);
271
272        // On ajoute le lieu, le mode et le service au contexte fourni au modele
273        $tableau['lieu'] = $lieu;
274        $tableau['mode'] = 'infos';
275        $tableau['service'] = $service;
276
277        if ($tableau['erreur'])
278                $texte = recuperer_fond("modeles/erreur", $tableau);
279        else
280                $texte = recuperer_fond("modeles/$modele", $tableau);
281
282        return $texte;
283}
284
285function rainette_debug($lieu, $mode='previsions', $service='weather') {
286
287        // Recuperation du tableau des conditions courantes
288        $charger = charger_fonction('charger_meteo', 'inc');
289        $nom_fichier = $charger($lieu, $mode, $service);
290        if ($nom_fichier) {
291                lire_fichier($nom_fichier,$tableau);
292                $tableau = unserialize($tableau);
293
294                // On ajoute le lieu, le mode et le service au contexte fourni au modele
295                if ($mode == 'previsions') {
296                        // Pour les prévisions les informations communes sont stockées dans un index supplémentaire en fin de tableau
297                        $index = count($tableau)-1;
298                        $tableau[$index]['lieu'] = $lieu;
299                        $tableau[$index]['mode'] = $mode;
300                        $tableau[$index]['service'] = $service;
301                }
302                else {
303                        $tableau['lieu'] = $lieu;
304                        $tableau['mode'] = $mode;
305                        $tableau['service'] = $service;
306                }
307
308                var_dump($tableau);
309        }
310}
311
312?>
Note: See TracBrowser for help on using the repository browser.