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

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

La validation XML renvoie un objet et pas un tableau en SPIP > 2.1.

  • 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) {
19
20        // On initialise le message de sortie
21        $message = '';
22       
23        // On recupere les infos du fichier xml de description de la balise
24        $infos = boussole_parser_xml($url);
25        if (!infos OR !$infos['boussole']['alias']){
26                $message = _T('boussole:message_nok_xml_invalide', array('fichier' => $url));
27                return array(false, $message);
28        }
29
30        // On complete les infos de chaque site
31        // - par l'id_syndic si ce site est deja reference dans la table spip_syndic.
32        //   On reconnait le site par son url
33        // - par la configuration de l'affichage si la boussole existe deja
34        foreach ($infos['sites'] as $_cle => $_info) {
35                // -- On recherche l'id_syndic en construisant deux urls possibles : l'une avec / l'autre sans
36                $urls = array();
37                $urls[] = $_info['url_site'];
38                $urls[] = (substr($_info['url_site'], -1, 1) == '/') ? substr($_info['url_site'], 0, -1) : $_info['url_site'] . '/';
39                if ($id_syndic = sql_getfetsel('id_syndic', 'spip_syndic', sql_in('url_site', $urls)))
40                        $infos['sites'][$_cle]['id_syndic'] = intval($id_syndic);
41                // -- On recherche une configuration d'affichage (si elle existe)
42                $where = array('aka_boussole=' .sql_quote($infos['boussole']['alias']),
43                                        'aka_site=' . sql_quote($_info['aka_site']));
44                if ($resultats = sql_fetsel('rang_groupe, rang_site, affiche', 'spip_boussoles', $where)) {
45                        $infos['sites'][$_cle]['rang_groupe'] = intval($resultats['rang_groupe']);
46                        $infos['sites'][$_cle]['rang_site'] = intval($resultats['rang_site']);
47                        $infos['sites'][$_cle]['affiche'] = $resultats['affiche'];
48                }
49        }
50       
51        // On insere le tableau des sites collecte dans la table spip_boussoles
52        $meta_boussole = 'boussole_infos_' . $infos['boussole']['alias'];
53        // -- suppression au prealable des sites appartenant a la meme boussole si elle existe
54        //    et determination du type d'action (ajout ou actualisation)
55        $actualisation = false;
56        if (lire_meta($meta_boussole)) {
57                $actualisation = true;
58                boussole_supprimer($infos['boussole']['alias']);
59        }
60        // -- insertion de la nouvelle liste de sites pour cette boussole
61        if (!$ids = sql_insertq_multi('spip_boussoles', $infos['sites'])) {
62                $message = _T('boussole:message_nok_ecriture_bdd');
63                return array(false, $message);
64        }
65        // -- consignation des informations de mise a jour de cette boussole dans la table spip_meta
66        $infos['boussole']['nbr_sites'] = count($infos['sites']);
67        $infos['boussole']['xml'] = $url;
68        ecrire_meta($meta_boussole, serialize($infos['boussole']));
69
70        // On definit le message de retour ok (actualisation ou ajout)
71        if ($actualisation)
72                $message = _T('boussole:message_ok_boussole_actualisee', array('fichier' => $url));
73        else
74                $message = _T('boussole:message_ok_boussole_ajoutee', array('fichier' => $url));
75       
76        return array(true, $message);
77}
78
79
80/**
81 * Suppression de la boussole dans la base de donnees
82 *
83 * @param int $aka_boussole
84 * @return boolean
85 */
86
87// $aka_boussole        => alias de la boussole, par defaut, spip
88function boussole_supprimer($aka_boussole) {
89       
90        // Alias non conforme
91        if (!$aka_boussole)
92                return false;
93
94        // On supprime les sites de cette boussole
95        sql_delete('spip_boussoles','aka_boussole='.sql_quote($aka_boussole));
96        // On supprime ensuite la meta consignant la derniere mise a jour de cette boussole
97        effacer_meta('boussole_infos_' . $aka_boussole);
98        return true;
99}
100
101
102// ----------------------- Traitements des fichiers xml ---------------------------------
103
104/**
105 * Teste l'existence d'un xml de boussole et renvoie le path complet ou l'url absolue
106 *
107 * @param string $xml
108 * @return string
109 */
110function boussole_localiser_xml($xml) {
111
112        include_spip('inc/distant');
113        include_spip('inc/filtres'); // url_absolue
114        $retour = '';
115
116        // On calcul une url absolue dans tous les cas
117        if (preg_match(",^(http|ftp)://,",$xml))
118                // Mode standard ou 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        $erreurs = is_array($retour) ? $retour[1] : $retour->err;
157        if ($erreurs === false) {
158                $ok = false;
159        }
160        else if ($erreurs) {
161                $erreur['detail'] = $erreurs;
162                $ok = false;
163        }
164
165        return $ok;
166}
167
168
169/**
170 * Renvoie, a partir du fichier xml de la boussole, un tableau des sites de la boussole
171 * Les cles du tableau correspondent au nom des champs en base de donnees
172 *
173 * @param string $url
174 * @return array()
175 */
176
177// $url => url ou path du fichier xml de description de la boussole
178function boussole_parser_xml($url) {
179
180        $infos = array();
181
182        // Lire les donnees du fichier xml d'une boussole
183        include_spip('inc/xml');
184        $xml = spip_xml_load($url);
185       
186        // On recupere les infos de la balise boussole
187        if (spip_xml_match_nodes(',^boussole,', $xml, $matches)){
188                $tag = array_keys($matches);
189                list($balise, $attributs) = spip_xml_decompose_tag($tag[0]);
190                $infos[$balise] = $attributs;
191       
192                // On recupere les infos des balises groupe et site
193                if (spip_xml_match_nodes(',^groupe,', $xml, $groupes)){
194                        $infos['sites'] = array();
195                        $rang_groupe = 0;
196                        foreach (array_keys($groupes) as $_groupe){
197                                $site = array();
198                                // On consigne l'alias et le rang du groupe
199                                list($balise_groupe, $attributs_groupe) = spip_xml_decompose_tag($_groupe);
200                                $rang_groupe = ++$i;
201                                // On consigne l'alias et l'url de chaque site du groupe en cours de traitement
202                                $rang_site = 0;
203                                foreach (array_keys($groupes[$_groupe][0]) as $_site){
204                                        // Alias de la boussole
205                                        $site['aka_boussole'] = $infos['boussole']['alias'];
206                                        // Infos du groupe
207                                        $site['aka_groupe'] = $attributs_groupe['type'];
208                                        $site['rang_groupe'] = $rang_groupe;
209                                        // Infos du site
210                                        list($balise_site, $attributs_site) = spip_xml_decompose_tag($_site);
211                                        $site['aka_site'] = $attributs_site['alias'];
212                                        $site['url_site'] = $attributs_site['src'];
213                                        $site['rang_site'] = ++$rang_site;
214                                        $site['affiche'] = 'oui';
215                                        $site['id_syndic'] = 0;
216                                        // On ajoute le site ainsi defini aux tableau des sites si celui-ci est actif
217                                        if ($attributs_site['actif'] == 'oui')
218                                                $infos['sites'][] = $site;
219                                }
220                        }
221                }
222        }
223       
224        return $infos;
225}
226
227?>
Note: See TracBrowser for help on using the repository browser.