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

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

On ajoute un champ id_syndic dans la table boussole afin de créer un lien avec le site référencé si il existe dans la table spip_syndic.
On ajoute un lien dans le formulaire d'éedition de la boussole vers la page de chaque site référencé.

  • Property svn:eol-style set to native
File size: 5.9 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5
6// ----------------------- Traitements des boussoles ---------------------------------
7
8/**
9 * Ajout du depot et de ses extensions 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, &$erreur='') {
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                $erreur = _T('boussole:message_nok_xml_invalide', array('fichier' => $url));
24                return false;
25        }
26        // On complete les infos de chaque site par l'id_syndic si ce site est deja reference
27        // dans la table spip_syndic. On reconnait le site par son url
28        foreach ($infos['sites'] as $_cle => $_info) {
29                // On construit deux urls : l'une avec / l'autre sans
30                $urls = array();
31                $urls[] = $_info['url_site'];
32                $urls[] = (substr($_info['url_site'], -1, 1) == '/') ? substr($_info['url_site'], 0, -1) : $_info['url_site'] . '/';
33                if ($id_syndic = sql_getfetsel('id_syndic', 'spip_syndic', sql_in('url_site', $urls)))
34                        $infos['sites'][$_cle]['id_syndic'] = intval($id_syndic);
35        }
36       
37        // On insere le tableau des sites collecte dans la table spip_boussoles
38        $meta_boussole = 'boussole_infos_' . $infos['boussole']['alias'];
39        // -- suppression au prealable des sites appartenant a la meme boussole si elle existe
40        if (lire_meta($meta_boussole))
41                boussole_supprimer($infos['boussole']['alias']);
42        // -- insertion de la nouvelle liste de sites pour cette boussole
43        if (!$ids = sql_insertq_multi('spip_boussoles', $infos['sites'])) {
44                $erreur = _T('boussole:message_nok_ecriture_bdd');
45                return false;
46        }
47        // -- consignation des informations de mise a jour de cette boussole dans la table spip_meta
48        $infos['boussole']['nbr_sites'] = count($infos['sites']);
49        $infos['boussole']['xml'] = $url;
50        ecrire_meta($meta_boussole, serialize($infos['boussole']));
51       
52        return true;
53}
54
55
56/**
57 * Suppression du depot et de ses extensions dans la base de donnees
58 *
59 * @param int $aka_boussole
60 * @return boolean
61 */
62
63// $aka_boussole        => alias de la boussole, par defaut, spip
64function boussole_supprimer($aka_boussole) {
65       
66        // Alias non conforme
67        if (!$aka_boussole)
68                return false;
69
70        // On supprime les sites de cette boussole
71        sql_delete('spip_boussoles','aka_boussole='.sql_quote($aka_boussole));
72        // On supprime ensuite la meta consignant la derniere mise a jour de cette boussole
73        effacer_meta('boussole_infos_' . $aka_boussole);
74        return true;
75}
76
77
78// ----------------------- Traitements des fichiers xml ---------------------------------
79
80/**
81 * Teste l'existence d'un xml de boussole et renvoie le path complet ou l'url absolue
82 *
83 * @param string $xml
84 * @return string
85 */
86function boussole_localiser_xml($xml, $mode) {
87
88        include_spip('inc/distant');
89        $retour = '';
90
91        // On calcul une url absolue dans tous les cas
92        if ($mode == 'standard')
93                // La boussole SPIP
94                $url = url_absolue(find_in_path('boussole_spip.xml'));
95        else
96                if (preg_match(",^(http|ftp)://,",$xml))
97                        // Mode perso : on a passe une url
98                        $url = url_absolue($xml);
99                else
100                        // Mode perso : on a passe un fichier seul,
101                        // on calcule l'url sachant que le fichier doit etre dans a la racine
102                        $url = url_absolue(find_in_path($xml));
103
104        // On verifie que le fichier existe
105        if (recuperer_page($url, false, false))
106                $retour = $url;
107
108        return $retour;
109}
110
111
112/**
113 * Teste la validite du fichier xml de la boussole en fonction de la DTD boussole.dtd
114 *
115 * @param string $url
116 * @param array &$erreur
117 * @return boolean
118 */
119
120// $url => url absolue du fichier xml de description de la boussole
121// $erreur      => tableau des erreurs collectees suite a la validation xml
122function boussole_valider_xml($url, &$erreur) {
123
124        include_spip('inc/distant');
125        $ok = true;
126
127        // On verifie la validite du contenu en fonction de la dtd
128        $valider_xml = charger_fonction('valider', 'xml');
129        $retour = $valider_xml(recuperer_page($url));
130        if ($retour[1] === false) {
131                $ok = false;
132        }
133        else if ($retour[1]) {
134                $erreur['detail'] = $retour[1];
135                $ok = false;
136        }
137
138        return $ok;
139}
140
141
142/**
143 * Renvoie, a partir du fichier xml de la boussole, un tableau des sites de la boussole
144 * Les cles du tableau correspondent au nom des champs en base de donnees
145 *
146 * @param string $url
147 * @return array()
148 */
149
150// $url => url ou path du fichier xml de description de la boussole
151function boussole_parser_xml($url) {
152
153        $infos = array();
154
155        // Lire les donnees du fichier xml d'une boussole
156        include_spip('inc/xml');
157        $xml = spip_xml_load($url);
158       
159        // On recupere les infos de la balise boussole
160        if (spip_xml_match_nodes(',^boussole,', $xml, $matches)){
161                $tag = array_keys($matches);
162                list($balise, $attributs) = spip_xml_decompose_tag($tag[0]);
163                $infos[$balise] = $attributs;
164       
165                // On recupere les infos des balises groupe et site
166                if (spip_xml_match_nodes(',^groupe,', $xml, $groupes)){
167                        $infos['sites'] = array();
168                        $rang_groupe = 0;
169                        foreach (array_keys($groupes) as $_groupe){
170                                $site = array();
171                                // On consigne l'alias et le rang du groupe
172                                list($balise_groupe, $attributs_groupe) = spip_xml_decompose_tag($_groupe);
173                                $rang_groupe = ++$i;
174                                // On consigne l'alias et l'url de chaque site du groupe en cours de traitement
175                                $rang_site = 0;
176                                foreach (array_keys($groupes[$_groupe][0]) as $_site){
177                                        // Alias de la boussole
178                                        $site['aka_boussole'] = $infos['boussole']['alias'];
179                                        // Infos du groupe
180                                        $site['aka_groupe'] = $attributs_groupe['type'];
181                                        $site['rang_groupe'] = $rang_groupe;
182                                        // Infos du site
183                                        list($balise_site, $attributs_site) = spip_xml_decompose_tag($_site);
184                                        $site['aka_site'] = $attributs_site['alias'];
185                                        $site['url_site'] = $attributs_site['src'];
186                                        $site['rang_site'] = ++$rang_site;
187                                        $site['affiche'] = 'oui';
188                                        $site['id_syndic'] = 0;
189                                        // On ajoute le site ainsi defini aux tableau des sites
190                                        $infos['sites'][] = $site;
191                                }
192                        }
193                }
194        }
195       
196        return $infos;
197}
198
199?>
Note: See TracBrowser for help on using the repository browser.