3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
6 * Copyright (c) 2001-2007 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
13 if (!defined("_ECRIRE_INC_VERSION")) return;
16 // http://doc.spip.org/@action_editer_site_dist
17 function action_editer_site_dist() {
19 $securiser_action = charger_fonction('securiser_action', 'inc');
20 $arg = $securiser_action();
22 if (preg_match(',options/(\d+),',$arg, $r)) {
24 editer_site_options($id_syndic);
25 // Envoi depuis le formulaire d'edition d'un site existant
26 } else if ($id_syndic = intval($arg)) {
28 // reload si on change une des valeurs de syndication
30 (_request('url_syndic') OR _request('resume') OR _request('syndication'))
31 AND $s = spip_query("SELECT url_syndic,syndication,resume FROM spip_syndic WHERE id_syndic="._q($id_syndic))
32 AND $t = spip_fetch_array($s)
34 (_request('url_syndic') AND _request('url_syndic') != $t['url_syndic'])
36 (_request('syndication') AND _request('syndication') != $t['syndication'])
38 (_request('resume') AND _request('resume') != $t['resume'])
41 set_request('reload', 'oui');
43 revisions_sites($id_syndic);
45 // Envoi depuis le formulaire de creation d'un site
46 else if ($arg == 'oui') {
47 set_request('reload', 'oui');
48 $id_syndic = insert_syndic(_request('id_parent'));
49 revisions_sites($id_syndic);
51 // Envoi depuis le formulaire d'analyse automatique d'un site
52 else if ($arg == 'auto') {
53 if ($auto = analyser_site(_request('url'))) {
54 $id_syndic = insert_syndic(_request('id_parent'));
55 revisions_sites($id_syndic, $auto);
56 if ($auto['syndication'] == 'oui')
57 set_request('reload', 'oui');
59 // Enregistrer le logo s'il existe
60 if ($auto['logo'] AND $auto['format_logo'])
61 @rename($auto['logo'],
62 _DIR_IMG
. 'siteon'.$id_syndic.'.'.$auto['format_logo']);
66 generer_url_ecrire('sites_edit', 'id_rubrique='._request('id_parent'),'&')
71 redirige_par_entete('./');
74 // Re-syndiquer le site
75 if (_request('reload') == 'oui') {
76 // Effacer les messages si on supprime la syndication
77 if (_request('syndication') == 'non')
78 spip_query("DELETE FROM spip_syndic_articles WHERE id_syndic="._q($id_syndic));
80 $s = spip_query("SELECT id_syndic, descriptif FROM spip_syndic WHERE id_syndic=$id_syndic AND syndication IN ('oui', 'sus', 'off') LIMIT 1");
81 if ($t = spip_fetch_array($s)) {
82 include_spip('inc/syndic');
83 syndic_a_jour($id_syndic);
85 // Si on n'a pas de descriptif ou pas de logo, on va le chercher
86 $chercher_logo = charger_fonction('chercher_logo', 'inc');
87 if (!$logo = $chercher_logo($id_syndic, 'id_syndic', 'on')
88 OR $t['descriptif'] == '') {
89 $auto = analyser_site(_request('url_syndic'));
90 revisions_sites($id_syndic,
91 array('descriptif' => $auto['descriptif'])
94 AND $auto['logo'] AND $auto['format_logo'])
95 @rename($auto['logo'],
96 _DIR_IMG
. 'siteon'.$id_syndic.'.'.$auto['format_logo']);
101 // Rediriger le navigateur
102 $redirect = parametre_url(urldecode(_request('redirect')),
103 'id_syndic', $id_syndic, '&');
104 redirige_par_entete($redirect);
107 // http://doc.spip.org/@insert_syndic
108 function insert_syndic($id_rubrique) {
110 include_spip('base/abstract_sql');
111 include_spip('inc/rubriques');
113 // Si id_rubrique vaut 0 ou n'est pas definie, creer le site
114 // dans la premiere rubrique racine
115 if (!$id_rubrique = intval($id_rubrique)) {
116 $row = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 ORDER by 0+titre,titre LIMIT 1"));
117 $id_rubrique = $row['id_rubrique'];
121 // Le secteur a la creation : c'est le secteur de la rubrique
122 $row = spip_fetch_array(spip_query("SELECT id_secteur FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
123 $id_secteur = $row['id_secteur'];
125 $id_syndic = spip_abstract_insert("spip_syndic",
126 "(id_rubrique, id_secteur, statut, date)",
127 "($id_rubrique, $id_secteur, 'prop', NOW())");
133 // Enregistre une revision de syndic
134 // $new indique si c'est un INSERT
135 // $c est un contenu (par defaut on prend le contenu via _request())
136 // http://doc.spip.org/@revisions_sites
137 function revisions_sites ($id_syndic, $c=false
) {
139 include_spip('inc/filtres');
140 include_spip('inc/autoriser');
141 include_spip('inc/rubriques');
143 // Ces champs seront pris nom pour nom (_POST[x] => spip_syndic.x)
144 $champs_normaux = array('nom_site', 'url_site', 'descriptif', 'url_syndic', 'syndication', 'url_propre');
146 // ne pas accepter de titre vide
147 if (_request('nom_site', $c) === '')
148 $c = set_request('nom_site', _T('ecrire:info_sans_titre'), $c);
151 foreach ($champs_normaux as $champ) {
152 $val = _request($champ, $c);
154 $champs[$champ] = corriger_caracteres($val);
157 // Changer le statut du site ?
158 include_spip('inc/auth');
159 auth_rubrique($GLOBALS['auteur_session']['id_auteur'], $GLOBALS['auteur_session']['statut']);
161 $s = spip_query("SELECT statut, id_rubrique FROM spip_syndic WHERE id_syndic=$id_syndic");
162 $row = spip_fetch_array($s);
163 $id_rubrique = $row['id_rubrique'];
164 $statut = $row['statut'];
166 if (_request('statut', $c)
167 AND _request('statut', $c) != $statut
168 AND autoriser('publierdans','rubrique',$id_rubrique)) {
169 $statut = $champs['statut'] = _request('statut', $c);
172 // Changer de rubrique ?
173 // Verifier que la rubrique demandee est differente
174 // de la rubrique actuelle
175 if ($id_parent = intval(_request('id_parent', $c))
176 AND $id_parent != $id_rubrique
177 AND (spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_rubrique=$id_parent")))) {
178 $champs['id_rubrique'] = $id_parent;
180 // si le site est publie
181 // et que le demandeur n'est pas admin de la rubrique
182 // repasser le site en statut 'prop'.
183 if ($statut == 'publie') {
184 if (!autoriser('publierdans','rubrique',$id_parent))
185 $champs['statut'] = $statut = 'prop';
189 // recuperer les extras
190 if ($GLOBALS['champs_extra']) {
191 include_spip('inc/extra');
192 if ($extra = extra_update('syndic', $id_syndic, $c))
193 $champs['extra'] = $extra;
196 // Envoyer aux plugins
197 include_spip('inc/modifier'); # temporaire pour eviter un bug
198 $champs = pipeline('pre_edition',
201 'table' => 'spip_syndic',
202 'id_objet' => $id_syndic
209 foreach ($champs as $champ => $val)
210 $update[] = $champ . '=' . _q($val);
212 if (!count($update)) return;
214 // Enregistrer les modifications
215 spip_query("UPDATE spip_syndic SET ".join(', ',$update)." WHERE id_syndic=$id_syndic");
217 // marquer le fait que le site est travaille par toto a telle date
218 // une alerte sera donnee aux autres redacteurs sur exec=sites
219 if ($GLOBALS['meta']['articles_modif'] != 'non') {
220 include_spip('inc/drapeau_edition');
221 signale_edition ($id_syndic, $GLOBALS['auteur_session'], 'syndic');
224 // Si on deplace le site
225 // - propager les secteurs
226 // - changer sa langue (si heritee)
227 if (isset($champs['id_rubrique'])) {
228 propager_les_secteurs();
230 $row = spip_fetch_array(spip_query("SELECT lang, langue_choisie FROM spip_syndic WHERE id_syndic=$id_syndic"));
231 $langue_old = $row['lang'];
232 $langue_choisie_old = $row['langue_choisie'];
234 if ($langue_choisie_old != "oui") {
235 $row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
236 $langue_new = $row['lang'];
237 if ($langue_new != $langue_old)
238 spip_query("UPDATE spip_syndic SET lang = '$langue_new' WHERE id_syndic = $id_syndic");
243 // Post-modifications
246 // Invalider les caches
247 if ($statut == 'publie') {
248 include_spip('inc/invalideur');
249 suivre_invalideur("id='id_syndic/$id_syndic'");
252 // Demander une reindexation du site
253 if ($statut == 'publie') {
254 include_spip('inc/indexation');
255 marquer_indexer('spip_syndic', $id_syndic);
258 // Recalculer les rubriques (statuts et dates) si l'on deplace
259 // un site publie ou si on le publie/depublie
260 if (isset($champs['statut'])
261 OR ($statut == 'publie' AND isset($champ['id_rubrique']))
263 calculer_rubriques();
267 pipeline('post_edition',
270 'table' => 'spip_syndic',
271 'id_objet' => $id_syndic
279 // http://doc.spip.org/@analyser_site
280 function analyser_site($url) {
281 include_spip('inc/filtres'); # pour filtrer_entites()
282 include_spip('inc/distant');
284 // Accepter les URLs au format feed:// ou qui ont oublie le http://
285 $url = preg_replace(',^feed://,i', 'http://', $url);
286 if (!preg_match(',^[a-z]+://,i', $url)) $url = 'http://'.$url;
288 $texte = recuperer_page($url, true
);
289 if (!$texte) return false
;
291 if (preg_match(',<(channel|feed)([:[:space:]][^>]*)?'
292 .'>(.*)</\1>,ims', $texte, $regs)) {
293 $result['syndication'] = 'oui';
294 $result['url_syndic'] = $url;
297 list($header) = preg_split(
298 ',<(entry|item)([:[:space:]][^>]*)?'.'>,Uims', $channel,2);
299 if (preg_match(',<title[^>]*>(.*)</title>,Uims', $header, $r))
300 $result['nom_site'] = supprimer_tags(filtrer_entites(trim($r[1])));
302 ',<link[^>]*[[:space:]]rel=["\']?alternate[^>]*>(.*)</link>,Uims',
304 $result['url_site'] = filtrer_entites($regs[1]);
305 else if (preg_match(',<link[^>]*[[:space:]]rel=.alternate[^>]*>,Uims',
307 $result['url_site'] = filtrer_entites(extraire_attribut($regs[0], 'href'));
308 else if (preg_match(',<link[^>]*>(.*)</link>,Uims', $header, $regs))
309 $result['url_site'] = filtrer_entites($regs[1]);
310 else if (preg_match(',<link[^>]*>,Uims', $header, $regs))
311 $result['url_site'] = filtrer_entites(extraire_attribut($regs[0], 'href'));
312 $result['url_site'] = url_absolue($result['url_site'], $url);
314 if (preg_match(',<(description|tagline)([[:space:]][^>]*)?'
315 .'>(.*)</\1>,Uims', $header, $r))
316 $result['descriptif'] = supprimer_tags(filtrer_entites($r[3]));
318 if (preg_match(',<image.*<url.*>(.*)</url>.*</image>,Uims',
320 AND preg_match(',(https?://.*/.*(gif|png|jpg)),ims', $r[1], $r)
321 AND $image = recuperer_infos_distantes($r[1])) {
322 if (in_array($image['extension'], array('gif', 'jpg', 'png'))) {
323 $result['format_logo'] = $image['extension'];
324 $result['logo'] = $image['fichier'];
326 else if ($image['fichier']) {
327 @unlink($image['fichier']);
332 $result['syndication'] = 'non';
333 $result['url_site'] = $url;
334 if (eregi('<head>(.*)', $texte, $regs))
335 $head = filtrer_entites(eregi_replace('</head>.*', '', $regs[1]));
338 if (eregi('<title[^>]*>(.*)', $head, $regs))
339 $result['nom_site'] = filtrer_entites(supprimer_tags(eregi_replace('</title>.*', '', $regs[1])));
340 if (eregi('<meta[[:space:]]+(name|http\-equiv)[[:space:]]*=[[:space:]]*[\'"]?description[\'"]?[[:space:]]+(content|value)[[:space:]]*=[[:space:]]*[\'"]([^>]+)[\'"]>', $head, $regs))
341 $result['descriptif'] = filtrer_entites(supprimer_tags($regs[3]));
343 // Cherchons quand meme un backend
344 include_spip('inc/distant');
345 include_spip('inc/feedfinder');
346 $feeds = get_feed_from_url($url, $texte);
347 // si on a a trouve un (ou plusieurs) on le note avec select:
348 // ce qui constitue un signal pour exec=sites qui proposera de choisir
349 // si on syndique, et quelle url.
350 if (count($feeds)>=1) {
351 spip_log("feedfinder.php :\n".join("\n", $feeds));
352 $result['url_syndic'] = "select: ".join(' ',$feeds);
358 // http://doc.spip.org/@editer_site_options
359 function editer_site_options($id_syndic)
361 $moderation = _request('moderation');
362 $miroir = _request('miroir');
363 $oubli = _request('oubli');
364 $resume = _request('resume');
366 if ($moderation == 'oui' OR $moderation == 'non')
367 spip_query("UPDATE spip_syndic SET moderation='$moderation' WHERE id_syndic=$id_syndic");
368 if ($miroir == 'oui' OR $miroir == 'non')
369 spip_query("UPDATE spip_syndic SET miroir='$miroir' WHERE id_syndic=$id_syndic");
370 if ($oubli == 'oui' OR $oubli == 'non')
371 spip_query("UPDATE spip_syndic SET oubli='$oubli' WHERE id_syndic=$id_syndic");
373 if ($resume == 'oui' OR $resume == 'non') {
374 spip_query("UPDATE spip_syndic SET resume='$resume' WHERE id_syndic=$id_syndic");
375 include_spip('inc/syndic');
376 syndic_a_jour($id_syndic);