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;
15 include_spip('inc/auth');
16 include_spip("inc/lang");
18 // http://doc.spip.org/@action_editer_breve_dist
19 function action_editer_breve_dist() {
21 $securiser_action = charger_fonction('securiser_action', 'inc');
22 $arg = $securiser_action();
24 // Envoi depuis les boutons "publier/supprimer cette breve"
25 if (preg_match(',^(\d+)\Wstatut\W(\w+)$,', $arg, $r)) {
27 set_request('statut', $r[2]);
28 revisions_breves($id_breve);
30 // Envoi depuis le formulaire d'edition pour chgt de langue
31 else if (preg_match(',^(\d+)\W(\w+)$,', $arg, $r)) {
32 revisions_breves_langue($id_breve=$r[1], $r[2], _request('changer_lang'));
34 // Envoi depuis le formulaire d'edition d'une breve existante
35 else if ($id_breve = intval($arg)) {
36 revisions_breves($id_breve);
38 // Envoi depuis le formulaire de creation d'une breve
39 else if ($arg == 'oui') {
40 $id_breve = insert_breve(_request('id_parent'));
41 revisions_breves($id_breve);
45 redirige_par_entete('./');
48 // Rediriger le navigateur
49 $redirect = parametre_url(urldecode(_request('redirect')),
50 'id_breve', $id_breve, '&');
52 redirige_par_entete($redirect);
55 // http://doc.spip.org/@insert_breve
56 function insert_breve($id_rubrique) {
58 include_spip('base/abstract_sql');
59 include_spip('inc/rubriques');
61 // Si id_rubrique vaut 0 ou n'est pas definie, creer la breve
62 // dans la premiere rubrique racine
63 if (!$id_rubrique = intval($id_rubrique)) {
64 $row = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 ORDER by 0+titre,titre LIMIT 1"));
65 $id_rubrique = $row['id_rubrique'];
68 // La langue a la creation : c'est la langue de la rubrique
69 $row = spip_fetch_array(spip_query("SELECT lang, id_secteur FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
72 $id_rubrique = $row['id_secteur']; // garantir la racine
74 $id_breve = spip_abstract_insert("spip_breves",
75 "(id_rubrique, statut, date_heure, lang, langue_choisie)",
76 "($id_rubrique, 'prop', NOW(), '$lang', '$choisie')");
81 // Enregistre une revision de breve
82 // $c est un contenu (par defaut on prend le contenu via _request())
83 // http://doc.spip.org/@revisions_breves
84 function revisions_breves ($id_breve, $c=false
) {
85 include_spip('inc/filtres');
86 include_spip('inc/rubriques');
87 include_spip('inc/autoriser');
89 // Ces champs seront pris nom pour nom (_POST[x] => spip_breves.x)
90 $champs_normaux = array('titre', 'texte', 'lien_titre', 'lien_url', 'url_propre');
92 // ne pas accepter de titre vide
93 if (_request('titre', $c) === '')
94 $c = set_request('titre', _T('ecrire:info_sans_titre'), $c);
97 foreach ($champs_normaux as $champ) {
98 $val = _request($champ, $c);
100 $champs[$champ] = corriger_caracteres($val);
103 // Changer le statut de la breve ?
104 $s = spip_query("SELECT statut, id_rubrique FROM spip_breves WHERE id_breve=$id_breve");
105 $row = spip_fetch_array($s);
106 $id_rubrique = $row['id_rubrique'];
107 $statut = $row['statut'];
109 if (_request('statut', $c)
110 AND _request('statut', $c) != $statut
111 AND autoriser('publierdans', 'rubrique', $id_rubrique)) {
112 $statut = $champs['statut'] = _request('statut', $c);
115 // Changer de rubrique ?
116 // Verifier que la rubrique demandee est a la racine et differente
117 // de la rubrique actuelle
118 if ($id_parent = intval(_request('id_parent', $c))
119 AND $id_parent != $id_rubrique
120 AND (spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 AND id_rubrique=$id_parent")))) {
121 $champs['id_rubrique'] = $id_parent;
123 // si la breve est publiee
124 // et que le demandeur n'est pas admin de la rubrique
125 // repasser la breve en statut 'prop'.
126 if ($statut == 'publie') {
127 if (!autoriser('publierdans','rubrique',$id_parent))
128 $champs['statut'] = $statut = 'prop';
132 // recuperer les extras
133 if ($GLOBALS['champs_extra']) {
134 include_spip('inc/extra');
135 if ($extra = extra_update('breves', $id_breve, $c))
136 $champs['extra'] = $extra;
139 // Envoyer aux plugins
140 include_spip('inc/modifier'); # temporaire pour eviter un bug
141 $champs = pipeline('pre_edition',
144 'table' => 'spip_breves',
145 'id_objet' => $id_breve
152 foreach ($champs as $champ => $val)
153 $update[] = $champ . '=' . _q($val);
155 if (!count($update)) return;
157 spip_query("UPDATE spip_breves SET ".join(', ',$update)." WHERE id_breve=$id_breve");
159 // marquer le fait que la breve est travaillee par toto a telle date
160 // une alerte sera donnee aux autres redacteurs sur exec=breves_voir
161 if ($GLOBALS['meta']['articles_modif'] != 'non') {
162 include_spip('inc/drapeau_edition');
163 signale_edition ($id_breve, $GLOBALS['auteur_session'], 'breve');
166 // Si on deplace la breve
167 // - propager les secteurs
168 // - changer sa langue (si heritee)
169 if (isset($champs['id_rubrique'])) {
170 propager_les_secteurs();
172 $row = spip_fetch_array(spip_query("SELECT lang, langue_choisie FROM spip_breves WHERE id_breve=$id_breve"));
173 $langue_old = $row['lang'];
174 $langue_choisie_old = $row['langue_choisie'];
176 if ($langue_choisie_old != "oui") {
177 $row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
178 $langue_new = $row['lang'];
179 if ($langue_new != $langue_old)
180 spip_query("UPDATE spip_breves SET lang = '$langue_new' WHERE id_breve = $id_breve");
185 // Post-modifications
188 // Invalider les caches
189 if ($statut == 'publie') {
190 include_spip('inc/invalideur');
191 suivre_invalideur("id='id_breve/$id_breve'");
194 // Demander une reindexation de la breve
195 if ($statut == 'publie') {
196 include_spip('inc/indexation');
197 marquer_indexer('spip_breves', $id_breve);
200 // Recalculer les rubriques (statuts et dates) si l'on deplace
201 // une breve publiee, ou si l'on publie/depublie une breve
202 if (isset($champs['statut'])
203 OR ($statut == 'publie' AND isset($champ['id_rubrique']))
205 calculer_rubriques();
209 pipeline('post_edition',
212 'table' => 'spip_breves',
213 'id_objet' => $id_breve
220 // http://doc.spip.org/@revisions_breves_langue
221 function revisions_breves_langue($id_breve, $id_rubrique, $changer_lang)
223 if ($changer_lang == "herit") {
224 $row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
225 $langue_parent = $row['lang'];
226 spip_query("UPDATE spip_breves SET lang=" . _q($langue_parent) . ", langue_choisie='non' WHERE id_breve=$id_breve");
227 calculer_langues_utilisees();
228 } else spip_query("UPDATE spip_breves SET lang=" . _q($changer_lang) . ", langue_choisie='oui' WHERE id_breve=$id_breve");