source: spip-zone/_plugins_/boussole/trunk/inc/deboussoler.php @ 70346

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

Mise au point de la base de données
Mise au point des modes serveur et client

  • Property svn:eol-style set to native
File size: 9.9 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5
6// ----------------------- Traitements des boussoles ---------------------------------
7
8/**
9 * Ajout de la boussole dans la base de donnees
10 *
11 * @param string $boussole      Alias de la boussole
12 * @param string $serveur       Alias du serveur fournissant les données sur la boussole
13 * @return array
14 */
15function boussole_ajouter($boussole, $serveur='spip') {
16
17        // On initialise le message de sortie
18        $message = '';
19       
20        // On recupere les infos du fichier xml de description de la balise
21        $infos = boussole_parser_xml($boussole, $serveur);
22        if (!$infos OR !$infos['boussole']['alias']){
23                $message = _T('boussole:message_nok_xml_invalide', array('fichier' => $boussole));
24                return array(false, $message);
25        }
26
27        // On complete les infos de chaque site
28        // - par l'id_syndic si ce site est deja reference dans la table spip_syndic.
29        //   On reconnait le site par son url
30        // - par la configuration de l'affichage si la boussole existe deja
31        foreach ($infos['sites'] as $_cle => $_info) {
32                // -- On recherche l'id_syndic en construisant deux urls possibles : l'une avec / l'autre sans
33                $urls = array();
34                $urls[] = $_info['url_site'];
35                $urls[] = (substr($_info['url_site'], -1, 1) == '/') ? substr($_info['url_site'], 0, -1) : $_info['url_site'] . '/';
36                if ($id_syndic = sql_getfetsel('id_syndic', 'spip_syndic', sql_in('url_site', $urls)))
37                        $infos['sites'][$_cle]['id_syndic'] = intval($id_syndic);
38                // -- On recherche une configuration d'affichage (si elle existe)
39                $where = array('aka_boussole=' .sql_quote($infos['boussole']['alias']),
40                                        'aka_site=' . sql_quote($_info['aka_site']));
41                if ($resultats = sql_fetsel('rang_groupe, rang_site, affiche', 'spip_boussoles', $where)) {
42                        $infos['sites'][$_cle]['rang_groupe'] = intval($resultats['rang_groupe']);
43                        $infos['sites'][$_cle]['rang_site'] = intval($resultats['rang_site']);
44                        $infos['sites'][$_cle]['affiche'] = $resultats['affiche'];
45                }
46        }
47       
48        // On insere le tableau des sites collecte dans la table spip_boussoles
49        $meta_boussole = 'boussole_infos_' . $infos['boussole']['alias'];
50        // -- suppression au prealable des sites appartenant a la meme boussole si elle existe
51        //    et determination du type d'action (ajout ou actualisation)
52        $actualisation = false;
53        if (lire_meta($meta_boussole)) {
54                $actualisation = true;
55                boussole_supprimer($infos['boussole']['alias']);
56        }
57        // -- insertion de la nouvelle liste de sites pour cette boussole
58        if (!sql_insertq_multi('spip_boussoles', $infos['sites'])) {
59                $message = _T('boussole:message_nok_ecriture_bdd', array('table' => 'spip_boussoles'));
60                return array(false, $message);
61        }
62        // -- insertion de la nouvelle liste des extras pour cette boussole
63        if (sql_insertq_multi('spip_boussoles_extras', $infos['extras']) === false) {
64                $message = _T('boussole:message_nok_ecriture_bdd', array('table' => 'spip_boussoles_extras'));
65                return array(false, $message);
66        }
67        // -- consignation des informations de mise a jour de cette boussole dans la table spip_meta
68        $infos['boussole']['nbr_sites'] = count($infos['sites']);
69        $infos['boussole']['serveur'] = $serveur;
70        $infos['boussole']['maj'] = date('Y-m-d H:i:s');
71        ecrire_meta($meta_boussole, serialize($infos['boussole']));
72
73        // On definit le message de retour ok (actualisation ou ajout)
74        if ($actualisation)
75                $message = _T('boussole:message_ok_boussole_actualisee', array('fichier' => $boussole));
76        else
77                $message = _T('boussole:message_ok_boussole_ajoutee', array('fichier' => $boussole));
78       
79        return array(true, $message);
80}
81
82
83/**
84 * Suppression de la boussole dans la base de donnees
85 *
86 * @param int $aka_boussole     alias de la boussole
87 * @return boolean
88 */
89function boussole_supprimer($aka_boussole) {
90       
91        // Alias non conforme
92        if (!$aka_boussole)
93                return false;
94
95        // On supprime les sites de cette boussole
96        sql_delete('spip_boussoles','aka_boussole='.sql_quote($aka_boussole));
97        // On supprime les extras de cette boussole
98        sql_delete('spip_boussoles_extras','aka_boussole='.sql_quote($aka_boussole));
99        // On supprime ensuite la meta consignant la derniere mise a jour de cette boussole
100        effacer_meta('boussole_infos_' . $aka_boussole);
101
102        return true;
103}
104
105
106// ----------------------- Traitements des fichiers xml ---------------------------------
107
108/**
109 * Teste l'existence d'un xml de boussole et renvoie le path complet ou l'url absolue
110 *
111 * @param string $xml
112 * @return string
113 */
114function boussole_localiser_xml($xml) {
115
116        include_spip('inc/distant');
117        include_spip('inc/filtres'); // url_absolue
118        $retour = '';
119
120        // On calcul une url absolue dans tous les cas
121        if (preg_match(",^(http|ftp)://,",$xml))
122                // Mode standard ou mode perso : on a passe une url
123                $url = url_absolue($xml);
124        else
125                // Mode perso : on a passe un fichier seul,
126                // on calcule l'url sachant que le fichier doit etre dans a la racine
127                $url = url_absolue(find_in_path($xml));
128
129        // On verifie que le fichier existe
130        if (recuperer_page($url, false, false))
131                $retour = $url;
132
133        return $retour;
134}
135
136
137/**
138 * Teste la validite du fichier xml de la boussole en fonction de la DTD boussole.dtd
139 *
140 * @param string $url
141 * @param array &$erreur
142 * @return boolean
143 */
144
145// $url => url absolue du fichier xml de description de la boussole
146// $erreur      => tableau des erreurs collectees suite a la validation xml
147function boussole_valider_xml($url, &$erreur) {
148
149        include_spip('inc/distant');
150        include_spip('inc/plugin');
151        $ok = true;
152
153        // On verifie la validite du contenu en fonction de la dtd
154        $valider_xml = charger_fonction('valider', 'xml');
155        // -- Compatibilite SPIP 2.0 : pas possible de verifer, on renvoie systematiquement true
156        if (spip_version_compare($GLOBALS['spip_version_branche'], '2.1', '<'))
157                return $ok;
158        // -- En SPIP >= 2.1 on peut effectuer la validation
159        $retour = $valider_xml(recuperer_page($url));
160        $erreurs = is_array($retour) ? $retour[1] : $retour->err;
161        if ($erreurs === false) {
162                $ok = false;
163        }
164        else if ($erreurs) {
165                $erreur['detail'] = $erreurs;
166                $ok = false;
167        }
168
169        return $ok;
170}
171
172
173/**
174 * Renvoie, a partir du fichier xml de la boussole, un tableau des sites de la boussole
175 * Les cles du tableau correspondent au nom des champs en base de donnees
176 *
177 * @param string $boussole      Alias de la boussole
178 * @param string $serveur       Alias du serveur fournissant les données sur la boussole
179 * @return array()
180 */
181function boussole_parser_xml($boussole, $serveur='spip') {
182        global $serveurs_boussoles;
183
184        $infos = array();
185
186        // Acquérir les informations de la boussole à partir du serveur
187        include_spip('inc/distant');
188        $action = str_replace('[arguments]', $boussole, $serveurs_boussoles[$serveur]);
189        $page = recuperer_page($action);
190
191        $convertir = charger_fonction('simplexml_to_array', 'inc');
192        $tableau = $convertir(simplexml_load_string($page), false);
193
194        if ($tableau['name'] == 'boussole') {
195                $infos['sites'] = array();
196                $infos['extras'] = array();
197
198                // Collecter les attributs pour la meta de la boussole
199                $infos['boussole'] = $tableau['attributes'];
200
201                // Construire l'objet extras de la boussole
202                $extra['aka_boussole'] = $infos['boussole']['alias'];
203                $extra['type_objet'] = 'boussole';
204                $extra['aka_objet'] = $infos['boussole']['alias'];
205                $extra['logo_objet'] = $infos['boussole']['logo'];
206                if (isset($tableau['children']['nom']))
207                        $extra['nom_objet'] = '<multi>' . $tableau['children']['nom'][0]['children']['multi'][0]['text'] . '</multi>';
208                if (isset($tableau['children']['slogan']))
209                        $extra['slogan_objet'] = '<multi>' . $tableau['children']['slogan'][0]['children']['multi'][0]['text'] . '</multi>';
210                if (isset($tableau['children']['description']))
211                        $extra['descriptif_objet'] = '<multi>' . $tableau['children']['description'][0]['children']['multi'][0]['text'] . '</multi>';
212                $infos['extras'][] = $extra;
213
214                // Collecter les informations des groupes
215                if (isset($tableau['children']['groupe'])) {
216                        $rang_groupe = 0;
217                        foreach ($tableau['children']['groupe'] as $_groupe) {
218                                // Construire l'objet extras du groupe
219                                $extra['aka_boussole'] = $infos['boussole']['alias'];
220                                $extra['type_objet'] = 'groupe';
221                                $extra['aka_objet'] = $_groupe['attributes']['type'];
222                                $extra['logo_objet'] = '';
223                                if (isset($_groupe['children']['nom']))
224                                        $extra['nom_objet'] = '<multi>' . $_groupe['children']['nom'][0]['children']['multi'][0]['text'] . '</multi>';
225                                $extra['slogan_objet'] = '';
226                                $extra['descriptif_objet'] = '';
227                                $infos['extras'][] = $extra;
228
229                                // On consigne l'alias et le rang du groupe
230                                $rang_groupe = ++$i;
231                                // On consigne l'alias et l'url de chaque site du groupe en cours de traitement
232                                $rang_site = 0;
233                                if (isset($_groupe['children']['site'])) {
234                                        foreach ($_groupe['children']['site'] as $_site){
235                                                if ($_site['attributes']['actif'] == 'oui') {
236                                                        // Alias de la boussole
237                                                        $site['aka_boussole'] = $infos['boussole']['alias'];
238                                                        // Infos du groupe
239                                                        $site['aka_groupe'] = $_groupe['attributes']['type'];
240                                                        $site['rang_groupe'] = $rang_groupe;
241                                                        // Infos du site
242                                                        $site['aka_site'] = $_site['attributes']['alias'];
243                                                        $site['url_site'] = $_site['attributes']['src'];
244                                                        $site['rang_site'] = ++$rang_site;
245                                                        $site['affiche'] = 'oui';
246                                                        $site['id_syndic'] = 0;
247                                                        $infos['sites'][] = $site;
248
249                                                        // Construire l'objet extra du site
250                                                        $extra['aka_boussole'] = $infos['boussole']['alias'];
251                                                        $extra['type_objet'] = 'site';
252                                                        $extra['aka_objet'] = $_site['attributes']['alias'];
253                                                        $extra['logo_objet'] = $_site['attributes']['logo'];
254                                                        if (isset($_site['children']['nom']))
255                                                                $extra['nom_objet'] = '<multi>' . $_site['children']['nom'][0]['children']['multi'][0]['text'] . '</multi>';
256                                                        if (isset($_site['children']['slogan']))
257                                                                $extra['slogan_objet'] = '<multi>' . $_site['children']['slogan'][0]['children']['multi'][0]['text'] . '</multi>';
258                                                        if (isset($_site['children']['description']))
259                                                                $extra['descriptif_objet'] = '<multi>' . $_site['children']['description'][0]['children']['multi'][0]['text'] . '</multi>';
260                                                        $infos['extras'][] = $extra;
261                                                }
262                                        }
263                                }
264                        }
265                }
266        }
267       
268        return $infos;
269}
270
271?>
Note: See TracBrowser for help on using the repository browser.