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

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

Maintenant que le fichier xml de la boussole SPIP est dans _galaxie_ :

  • on le supprime du plugin
  • on corrige l'url du fichier dans le traitement d'ajout de la boussole
  • Property svn:eol-style set to native
File size: 7.3 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 $url
12 * @param string &$erreur
13 * @return boolean
14 */
15
16// $url => url ou path du fichier xml de description de la boussole
17// $erreur      => message d'erreur deja traduit
18function boussole_ajouter($url, &$message='') {
19
20        // On recupere les infos du fichier xml de description de la balise
21        $infos = boussole_parser_xml($url);
22        if (!infos OR !$infos['boussole']['alias']){
23                $message = _T('boussole:message_nok_xml_invalide', array('fichier' => $url));
24                return false;
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 (!$ids = sql_insertq_multi('spip_boussoles', $infos['sites'])) {
59                $message = _T('boussole:message_nok_ecriture_bdd');
60                return false;
61        }
62        // -- consignation des informations de mise a jour de cette boussole dans la table spip_meta
63        $infos['boussole']['nbr_sites'] = count($infos['sites']);
64        $infos['boussole']['xml'] = $url;
65        ecrire_meta($meta_boussole, serialize($infos['boussole']));
66
67        // On definit le message de retour ok (actualisation ou ajout)
68        if ($actualisation)
69                $message = _T('boussole:message_ok_boussole_actualisee', array('fichier' => $url));
70        else
71                $message = _T('boussole:message_ok_boussole_ajoutee', array('fichier' => $url));
72       
73        return true;
74}
75
76
77/**
78 * Suppression de la boussole dans la base de donnees
79 *
80 * @param int $aka_boussole
81 * @return boolean
82 */
83
84// $aka_boussole        => alias de la boussole, par defaut, spip
85function boussole_supprimer($aka_boussole) {
86       
87        // Alias non conforme
88        if (!$aka_boussole)
89                return false;
90
91        // On supprime les sites de cette boussole
92        sql_delete('spip_boussoles','aka_boussole='.sql_quote($aka_boussole));
93        // On supprime ensuite la meta consignant la derniere mise a jour de cette boussole
94        effacer_meta('boussole_infos_' . $aka_boussole);
95        return true;
96}
97
98
99// ----------------------- Traitements des fichiers xml ---------------------------------
100
101/**
102 * Teste l'existence d'un xml de boussole et renvoie le path complet ou l'url absolue
103 *
104 * @param string $xml
105 * @return string
106 */
107function boussole_localiser_xml($xml, $mode) {
108
109        include_spip('inc/distant');
110        $retour = '';
111
112        // On calcul une url absolue dans tous les cas
113        if ($mode == 'standard')
114                // La boussole SPIP
115                $url = url_absolue('http://zone.spip.org/trac/spip-zone/export/HEAD/_galaxie_/boussole_spip.xml');
116        else
117                if (preg_match(",^(http|ftp)://,",$xml))
118                        // Mode perso : on a passe une url
119                        $url = url_absolue($xml);
120                else
121                        // Mode perso : on a passe un fichier seul,
122                        // on calcule l'url sachant que le fichier doit etre dans a la racine
123                        $url = url_absolue(find_in_path($xml));
124
125        // On verifie que le fichier existe
126        if (recuperer_page($url, false, false))
127                $retour = $url;
128
129        return $retour;
130}
131
132
133/**
134 * Teste la validite du fichier xml de la boussole en fonction de la DTD boussole.dtd
135 *
136 * @param string $url
137 * @param array &$erreur
138 * @return boolean
139 */
140
141// $url => url absolue du fichier xml de description de la boussole
142// $erreur      => tableau des erreurs collectees suite a la validation xml
143function boussole_valider_xml($url, &$erreur) {
144
145        include_spip('inc/distant');
146        include_spip('inc/plugin');
147        $ok = true;
148
149        // On verifie la validite du contenu en fonction de la dtd
150        $valider_xml = charger_fonction('valider', 'xml');
151        // -- Compatibilite SPIP 2.0 : pas possible de verifer, on renvoie systematiquement true
152        if (spip_version_compare($GLOBALS['spip_version_branche'], '2.1', '<'))
153                return $ok;
154        // -- En SPIP >= 2.1 on peut effectuer la validation
155        $retour = $valider_xml(recuperer_page($url));
156        if ($retour[1] === false) {
157                $ok = false;
158        }
159        else if ($retour[1]) {
160                $erreur['detail'] = $retour[1];
161                $ok = false;
162        }
163
164        return $ok;
165}
166
167
168/**
169 * Renvoie, a partir du fichier xml de la boussole, un tableau des sites de la boussole
170 * Les cles du tableau correspondent au nom des champs en base de donnees
171 *
172 * @param string $url
173 * @return array()
174 */
175
176// $url => url ou path du fichier xml de description de la boussole
177function boussole_parser_xml($url) {
178
179        $infos = array();
180
181        // Lire les donnees du fichier xml d'une boussole
182        include_spip('inc/xml');
183        $xml = spip_xml_load($url);
184       
185        // On recupere les infos de la balise boussole
186        if (spip_xml_match_nodes(',^boussole,', $xml, $matches)){
187                $tag = array_keys($matches);
188                list($balise, $attributs) = spip_xml_decompose_tag($tag[0]);
189                $infos[$balise] = $attributs;
190       
191                // On recupere les infos des balises groupe et site
192                if (spip_xml_match_nodes(',^groupe,', $xml, $groupes)){
193                        $infos['sites'] = array();
194                        $rang_groupe = 0;
195                        foreach (array_keys($groupes) as $_groupe){
196                                $site = array();
197                                // On consigne l'alias et le rang du groupe
198                                list($balise_groupe, $attributs_groupe) = spip_xml_decompose_tag($_groupe);
199                                $rang_groupe = ++$i;
200                                // On consigne l'alias et l'url de chaque site du groupe en cours de traitement
201                                $rang_site = 0;
202                                foreach (array_keys($groupes[$_groupe][0]) as $_site){
203                                        // Alias de la boussole
204                                        $site['aka_boussole'] = $infos['boussole']['alias'];
205                                        // Infos du groupe
206                                        $site['aka_groupe'] = $attributs_groupe['type'];
207                                        $site['rang_groupe'] = $rang_groupe;
208                                        // Infos du site
209                                        list($balise_site, $attributs_site) = spip_xml_decompose_tag($_site);
210                                        $site['aka_site'] = $attributs_site['alias'];
211                                        $site['url_site'] = $attributs_site['src'];
212                                        $site['rang_site'] = ++$rang_site;
213                                        $site['affiche'] = 'oui';
214                                        $site['id_syndic'] = 0;
215                                        // On ajoute le site ainsi defini aux tableau des sites si celui-ci est actif
216                                        if ($attributs_site['actif'] == 'oui')
217                                                $infos['sites'][] = $site;
218                                }
219                        }
220                }
221        }
222       
223        return $infos;
224}
225
226?>
Note: See TracBrowser for help on using the repository browser.