1 | <?php |
---|
2 | |
---|
3 | if (!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 |
---|
18 | function 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 |
---|
85 | function 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 | */ |
---|
107 | function 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(find_in_path('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 |
---|
143 | function 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 |
---|
177 | function 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 |
---|
216 | $infos['sites'][] = $site; |
---|
217 | } |
---|
218 | } |
---|
219 | } |
---|
220 | } |
---|
221 | |
---|
222 | return $infos; |
---|
223 | } |
---|
224 | |
---|
225 | ?> |
---|