source: spip-zone/_plugins_/projets/branches/v0/action/editer_projet.php @ 78524

Last change on this file since 78524 was 78524, checked in by teddy.spip@…, 6 years ago

Suite à r78521, il ne faut oublier tout ce qui va de paire…

  • Property svn:eol-style set to native
File size: 6.1 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2009                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
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\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15// http://doc.spip.org/@action_editer_article_dist
16function action_editer_projets_dist() {
17
18        $securiser_action = charger_fonction('securiser_action', 'inc');
19        $arg = $securiser_action();
20
21        // si id_article n'est pas un nombre, c'est une creation
22        // mais on verifie qu'on a toutes les donnees qu'il faut.
23        if (!$id_projet = intval($arg)) {
24                $id_parent = _request('id_parent');
25                if (!$id_parent){
26                        $id_parent = 0;
27                }
28                $id_auteur = $GLOBALS['visiteur_session']['id_auteur'];
29                if (!($id_auteur)) {
30                        include_spip('inc/headers');
31                        redirige_url_ecrire();
32                }
33                $id_projet = insert_projet($id_parent);
34        }
35
36        // Enregistre l'envoi dans la BD
37        if ($id_projet > 0) $err = projet_set($id_projet);
38
39        if (_request('redirect')) {
40                $redirect = parametre_url(urldecode(_request('redirect')),
41                        'id_projet', $id_projet, '&') . $err;
42
43                include_spip('inc/headers');
44                redirige_par_entete($redirect);
45        }
46        else
47                return array($id_projet,$err);
48}
49
50// Appelle toutes les fonctions de modification d'un projet
51// $err est de la forme '&trad_err=1'
52// http://doc.spip.org/@articles_set
53function projet_set($id_projet) {
54        $err = '';
55
56        // unifier $texte en cas de texte trop long
57        trop_longs_articles();
58
59        $c = array();
60        foreach (array(
61                'titre','descriptif','chapo', 'texte'
62        ) as $champ)
63                $c[$champ] = _request($champ);
64
65        include_spip('inc/modifier');
66        revision_projet($id_projet, $c);
67
68        // Modification de statut, changement de rubrique ?
69        $c = array();
70        foreach (array(
71                'date', 'statut', 'id_parent'
72        ) as $champ)
73                $c[$champ] = _request($champ);
74        $err .= instituer_projet($id_projet, $c);
75
76        return $err;
77}
78
79// http://doc.spip.org/@insert_article
80function insert_projet($id_parent) {
81
82        // La langue a la creation : si les liens de traduction sont autorises
83        // dans les rubriques, on essaie avec la langue de l'auteur,
84        // ou a defaut celle de la rubrique
85        // Sinon c'est la langue de la rubrique qui est choisie + heritee
86
87
88        $id_projet = sql_insertq("spip_projets", array(
89                'id_parent' => $id_parent,
90                'statut' =>  'prepa',
91                'date' => date('Y-m-d H:i:s')
92        ));
93
94        if ($id_projet > 0)
95                sql_insertq('spip_projets_liens', array('id_projet'=>$id_projet, 'objet' => 'auteur', 'id_objet' => $GLOBALS['visiteur_session']['id_auteur'], 'type' => 'admin'));
96        return $id_projet;
97}
98
99
100// $c est un array ('statut', 'id_parent' = changement de projet parent)
101//
102// statut et rubrique sont lies, car un admin restreint peut deplacer
103// un article publie vers une rubrique qu'il n'administre pas
104// http://doc.spip.org/@instituer_article
105function instituer_projet($id_projet, $c, $calcul_rub=true) {
106
107        include_spip('inc/autoriser');
108        include_spip('inc/modifier');
109
110        $row = sql_fetsel("statut, date, id_parent", "spip_projets", "id_projet=$id_projet");
111        $id_parent = $row['id_parent'];
112        $statut_ancien = $statut = $row['statut'];
113        $date_ancienne = $date = $row['date'];
114        $champs = array();
115
116        $d = isset($c['date'])?$c['date']:null;
117        $s = isset($c['statut'])?$c['statut']:$statut;
118
119        // cf autorisations dans inc/instituer_article
120        if ($s != $statut OR ($d AND $d != $date)) {
121                if (autoriser('creer', 'projet'))
122                        $statut = $champs['statut'] = $s;
123                else if (autoriser('modifier', 'article', $id_article) AND $s != 'publie')
124                        $statut = $champs['statut'] = $s;
125                else
126                        spip_log("editer_article $id_article refus " . join(' ', $c));
127
128                // En cas de publication, fixer la date a "maintenant"
129                // sauf si $c commande autre chose
130                // ou si l'article est deja date dans le futur
131                // En cas de proposition d'un article (mais pas depublication), idem
132                if ($champs['statut'] == 'publie'
133                 OR ($champs['statut'] == 'prop' AND !in_array($statut_ancien, array('publie', 'prop')))
134                ) {
135                        if ($d OR strtotime($d=$date)>time())
136                                $champs['date'] = $date = $d;
137                        else
138                                $champs['date'] = $date = date('Y-m-d H:i:s');
139                }
140        }
141
142        // Verifier que la rubrique demandee existe et est differente
143        // de la rubrique actuelle
144        if ($id_parent = $c['id_parent']
145        AND (sql_fetsel('1', "spip_projets", "id_projet=$id_parent"))) {
146                $champs['id_parent'] = $id_parent;
147
148                // si l'article etait publie
149                // et que le demandeur n'est pas admin de la rubrique
150                // repasser l'article en statut 'propose'.
151                if ($statut == 'publie'
152                AND !autoriser('modifier', 'projet'))
153                        $champs['statut'] = 'prop';
154        }
155
156
157        // Envoyer aux plugins
158        $champs = pipeline('pre_edition',
159                array(
160                        'args' => array(
161                                'table' => 'spip_projets',
162                                'id_objet' => $id_projet,
163                                'action'=>'instituer'
164                        ),
165                        'data' => $champs
166                )
167        );
168
169        if (!count($champs)) return;
170
171        // Envoyer les modifs.
172
173        sql_updateq('spip_projets', $champs, "id_projet=$id_projet");
174
175        // Invalider les caches
176        include_spip('inc/invalideur');
177        suivre_invalideur("id='id_projets/$id_projet'");
178
179        // Pipeline
180        pipeline('post_edition',
181                array(
182                        'args' => array(
183                                'table' => 'spip_projets',
184                                'id_objet' => $id_projet
185                        ),
186                        'data' => $champs
187                )
188        );
189
190        // Notifications
191        if ($notifications = charger_fonction('notifications', 'inc')) {
192                $notifications('instituerprojet', $id_projet,
193                        array('statut' => $statut, 'statut_ancien' => $statut_ancien)
194                );
195        }
196
197        return ''; // pas d'erreur
198}
199
200//
201// Reunit les textes decoupes parce que trop longs
202//
203
204// http://doc.spip.org/@trop_longs_articles
205function trop_longs_articles() {
206        if (is_array($plus = _request('texte_plus'))) {
207                foreach ($plus as $n=>$t) {
208                        $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,","", $t);
209                }
210                set_request('texte', join('',$plus) . _request('texte'));
211        }
212}
213
214?>
Note: See TracBrowser for help on using the repository browser.