source: trunk/spip/esqueleto-redcta/plugins/crayons/action/crayons_store.php @ 69

Last change on this file since 69 was 69, checked in by guille, 16 years ago

Se agrego Plugin Crayon y se actualizaron los esqueletos para que funcione

File size: 10.1 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5function verif_secu($w, $secu) {
6    return (
7        $secu == md5($GLOBALS['meta']['alea_ephemere'].'='.$w)
8    OR
9        $secu == md5($GLOBALS['meta']['alea_ephemere_ancien'].'='.$w)
10    );
11}
12
13function post_crayons() {
14    $results = array();
15    if (isset($_POST['crayons']) AND is_array($_POST['crayons']))
16    foreach ($_POST['crayons'] as $crayon) {
17
18        $name = $_POST['name_'.$crayon];
19        $content = array();
20        if ($_POST['fields_'.$crayon]) {
21          foreach (explode(',', $_POST['fields_'.$crayon]) as $field) {
22            // cas particulier d'un envoi de fichier
23            if (isset($_FILES['content_'.$crayon.'_'.$field])) {
24                $content[$field] = $_FILES['content_'.$crayon.'_'.$field];
25            } else {
26                $content[$field] = $_POST['content_'.$crayon.'_'.$field];
27                // Compatibilite charset autre que utf8 ; en effet on recoit
28                // obligatoirement les donnees en utf-8, par la magie d'ajax
29                if ($GLOBALS['meta']['charset']!='utf-8') {
30                    include_spip('inc/charsets');
31                    $content[$field] = importer_charset($content[$field], 'utf-8');
32                }
33            }
34          }
35        }
36
37        // Si les donnees POSTees ne correspondent pas a leur md5,
38        // il faut les traiter
39        if (md5(serialize($content)) <> $_POST['md5_'.$crayon]) {
40            if (!isset($_POST['secu_'.$crayon])
41            OR verif_secu($name, $_POST['secu_'.$crayon])) {
42                $results[] = array($name, $content, $_POST['md5_'.$crayon], $crayon);
43            }
44            else {
45                return false; // erreur secu
46            }
47        }
48        // cas inchange
49        else
50            $results[] = array($name, $content, false, $crayon);
51    }
52
53    return $results;
54}
55
56
57function crayons_store() {
58        include_spip('inc/crayons');
59        $wdgcfg = wdgcfg();
60       
61        $return = array('$erreur'=>'');
62
63        $postees = post_crayons();
64
65        $modifs = $updates = array();
66        if (!is_array($postees)) {
67                $return['$erreur'] = _U('crayons:donnees_mal_formatees');
68        } else {
69                include_spip('inc/autoriser');
70
71                foreach ($postees as $postee) {
72                        $name = $postee[0];
73                        $content = $postee[1];
74
75                        if ($content && preg_match(_PREG_CRAYON, 'crayon '.$name, $regs)) {
76                                list(,$crayon,$type,$modele,$id) = $regs;
77                                $wid = $postee[3];
78
79                                if (!autoriser('modifier', $type, $id, NULL, array('modele'=>$modele))) {
80                                        $return['$erreur'] =
81                                                "$type $id: " . _U('crayons:non_autorise');
82                                } else {
83
84                                        // recuperer l'existant pour calculer son md5 et verifier
85                                        // qu'il n'a pas ete modifie entre-temps
86                                        $data = valeur_colonne_table($type, array_keys($content), $id);
87                                        $md5 = md5(serialize($data));
88
89                                        // est-ce que le champ a ete modifie dans la base entre-temps ?
90                                        if ($md5 != $postee[2]) {
91                                                // si oui, la modif demandee correspond peut-etre
92                                                // a la nouvelle valeur ? dans ce cas on procede
93                                                // comme si "pas de modification", sinon erreur
94                                                if ($md5 != md5(serialize($content))) {
95                                                        $return['$erreur'] = "$type $id $champtable: " .
96                                                                _U('crayons:modifie_par_ailleurs');
97                                                }
98                                        }
99
100                                        $modifs[] = array($type, $modele, $id, $content, $wid);
101                                }
102                        }
103                }
104        }
105
106        if (!$modifs AND !$return['$erreur']) {
107                $return['$erreur'] = $wdgcfg['msgNoChange'] ?
108                   _U('crayons:pas_de_modification') : ' ';
109                $return['$annuler'] = true;
110        }
111
112        // une quelconque erreur ... ou rien ==> on ne fait rien !
113        if ($return['$erreur'])
114                return $return;
115
116        // sinon on bosse : toutes les modifs ont ete acceptees
117        // verifier qu'on a tout ce qu'il faut pour mettre a jour la base
118        // et regrouper les mises a jour par type/id
119        foreach ($modifs as $modif) {
120                list($type, $modele, $id, $content, $wid) = $modif;
121                if (!isset($updates[$type])) {
122                        // MODELE
123                        $fun = '';
124                        if (function_exists($f = $type.'_'. $modele . "_revision")
125                        OR function_exists($f = $modele . "_revision")
126                        OR function_exists($f = $type . "_revision"))
127                                $fun = $f;
128                        else switch($type) {
129                                case 'article':
130                                    $fun = 'crayons_update_article';
131                                    break;
132                                case 'breve':
133                                    include_spip('action/editer_breve');
134                                    $fun = 'revisions_breves';
135                                    break;
136                                case 'forum':
137                                    include_spip('inc/forum');
138                                    $fun = 'enregistre_et_modifie_forum';
139                                    break;
140                                case 'rubrique':
141                                    include_spip('action/editer_rubrique');
142                                    $fun = 'revisions_rubriques';
143                                    break;
144                                case 'syndic':
145                                case 'site':
146                                    include_spip('action/editer_site');
147                                    $fun = 'revisions_sites';
148                                    break;
149                                // cas geres de la maniere la plus standard
150                                case 'auteur':
151                                case 'document':
152                                case 'mot':
153                                case 'signature':
154                                case 'petition':
155                                default:
156                                    include_spip('inc/modifier');
157                                    $fun = 'revision_'.$type;
158                                    break;
159                        }
160                        if (!$fun or !function_exists($fun)) {
161                                    $fun = 'crayons_update';
162//                          $return['$erreur'] = "$type: " . _U('crayons:non_implemente');
163//                          break;
164                        }
165                        $updates[$type] = array('fun'=>$fun, 'ids'=>array());
166                }
167                if (!isset($updates[$type]['ids'][$id])) {
168                        $updates[$type]['ids'][$id] = array('wdg'=>array(), 'chval'=>array());
169                }
170                // pour reaffecter le retour d'erreur sql au cas ou
171                $updates[$type]['ids'][$id]['wdg'][] = $wid;
172                foreach ($content as $champtable => $val) {
173                        $updates[$type]['ids'][$id]['chval'][$champtable] = $val;
174                }
175        }
176
177        // il manque une fonction de mise à jour ==> on ne fait rien !
178        if ($return['$erreur'])
179            return $return;
180
181        // hop ! mises à jour table par table et id par id
182        foreach ($updates as $type => $idschamps) {
183                foreach ($idschamps['ids'] as $id => $champsvaleurs) {
184                // Enregistrer dans la base
185                // $updok = ... quand on aura un retour
186                // -- revisions_articles($id_article, $c) --
187                $idschamps['fun']($id, $champsvaleurs['chval'], $type, $champsvaleurs['wdg']);
188            }
189        }
190
191        // et maintenant refaire l'affichage des crayons modifies
192        include_spip('inc/texte');
193        foreach ($modifs as $m) {
194                list($type, $modele, $id, $content, $wid) = $m;
195                        $f = charger_fonction($type.'_'.$modele, 'vues', true)
196                          OR $f = charger_fonction($modele, 'vues', true)
197                          OR $f = charger_fonction($type, 'vues', true)
198                          OR $f = 'vues_dist';
199                        $return[$wid] = $f($type, $modele, $id, $content);
200        }
201        return $return;
202}
203
204//
205// VUE
206//
207function vues_dist($type, $modele, $id, $content){
208
209        // pour ce qui a une {lang_select} par defaut dans la boucle,
210        // la regler histoire d'avoir la bonne typo dans le propre()
211        // NB: ceci n'a d'impact que sur le "par defaut" en bas
212        if (colonne_table($type, 'lang')) {
213                $b = valeur_colonne_table($type, 'lang', $id);
214                lang_select($a = array_pop($b));
215        } else {
216                lang_select($a = $GLOBALS['meta']['langue_site']);
217        }
218
219  // chercher vues/article_toto.html
220  // sinon vues/toto.html
221  if (find_in_path( ($fond = 'vues/' . $type . '_' . $modele) . '.html')
222  OR find_in_path( ($fond = 'vues/' . $modele) .'.html')
223  OR find_in_path( ($fond = 'vues/' . $type) .'.html')) {
224                $contexte = array(
225                    'id_' . $type => $id,
226                    'champ' => $modele,
227                    'class' => _request('class'),
228                    'self' => _request('self'),
229                    'lang' => $GLOBALS['spip_lang']
230                );
231                $contexte = array_merge($contexte, $content);
232                include_spip('public/assembler');
233                return recuperer_fond($fond, $contexte);
234  }
235        // vue par defaut
236        else {
237                // Par precaution on va rechercher la valeur
238                // dans la base de donnees (meme si a priori la valeur est
239                // ce qu'on vient d'envoyer, il y a nettoyage des caracteres et
240                // eventuellement d'autres filtres de saisie...)
241                $valeur = array_pop(valeur_colonne_table($type, $modele, $id));
242               
243                // seul spip core sait rendre les donnees
244                if (in_array($modele,
245                  array('chapo', 'texte', 'descriptif', 'ps', 'bio'))) {
246                        return propre($valeur);
247                } else {
248                        return typo($valeur);
249                }
250        }
251}
252
253//
254// Fonctions de mise a jour generique
255//
256function crayons_update($id, $colval = array(), $type = '')
257{
258        if (!$colval) {
259                return false;
260        }
261        list($nom_table, $where) = table_where($type, $id);
262        if (!$nom_table) {
263                return false;
264        }
265
266        $update = $sep = '';
267        foreach ($colval as $col => $val) {
268                $update .= $sep . '`' . $col . '`=' . _q($val);
269                $sep = ', ';
270        }
271
272        $a = spip_query($q = 
273        'UPDATE `' . $nom_table . '` SET ' . $update . ' WHERE ' . $where);
274
275        #spip_log($q);
276        include_spip('inc/invalideur');
277        suivre_invalideur($cond, $modif=true);
278
279        return $a;
280}
281
282//
283// Fonctions de mise a jour
284//
285function crayons_update_article($id_article, $c = false) {
286        include_spip('action/editer_article');
287
288        // Enregistrer les nouveaux contenus
289        revisions_articles($id_article, $c);
290
291        // En cas de statut ou de id_rubrique
292        // NB: instituer_article veut id_parent, et pas id_rubrique !
293        if (isset($c['id_rubrique'])) {
294                $c['id_parent'] = $c['id_rubrique'];
295                unset ($c['id_rubrique']);
296        }
297        instituer_article($id_article, $c);
298}
299
300// TODO:
301// Ce modele est cense enregistrer les tags sous forme de ??
302// une ligne dans un champ spip_articles.tags, et/ou des mots-clés...
303function modeles_tags($id, $c) {
304        var_dump($id); #id_article
305        var_dump($c); # perturbant : ici on a array('id_article'=>'valeur envoyee')
306}
307
308function action_crayons_store_dist() {
309        header("Content-Type: text/html; charset=".$GLOBALS['meta']['charset']);
310        lang_select($GLOBALS['auteur_session']['lang']);
311
312        $r = crayons_store();
313
314        // Si on a ete appeles par jQuery, on renvoie tout, c'est le client
315        // crayons.js qui va traiter l'affichage du resultat et status
316        # Attention le test $_SERVER["HTTP_X_REQUESTED_WITH"] === "XMLHttpRequest"
317        # n'est pas bon car le cas d'un fichier uploade via iframe n'est pas detecte
318
319        // S'il y a une adresse de redirection, on renvoie vers elle
320        // En cas d'erreur il faudrait ajouter &err=... dans l'url ?
321        if (_request('redirect')) {
322                if (!$r['$erreur']
323                OR $r['$annuler']) {
324                        include_spip('inc/headers');
325                        redirige_par_entete(_request('redirect'));
326                } else {
327                        echo "<h4 class='status'>".$r['$erreur']."</h4>\n";
328
329                        foreach ($r as $wid => $v) {
330                                if ($wid !== '$erreur')
331                                        echo "<div id='$wid'>$v</div><hr />\n";
332                        }
333                        echo "<a href='".quote_amp(_request('redirect'))."'>"
334                                .quote_amp(_request('redirect'))
335                                ."</a>\n";
336                }
337        }
338
339        // Cas normal : JSON
340        else {
341                echo json_export($r);
342        }
343
344        exit;
345}
346
347?>
Note: See TracBrowser for help on using the repository browser.