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

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

Premier lot d'optimisation de la boussole en SPIP 3

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