source: spip-zone/_plugins_/crayons/inc/crayons.php @ 55041

Last change on this file since 55041 was 55041, checked in by real3t@…, 8 years ago

Possibilité d'éditer avec les crayons le Slogan du site (plugin Slogan, plugin Bandeau, et SPIP 3)

File size: 16.4 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5define('_PREG_CRAYON', ',crayon\b[^<>\'"]+?\b((\w+)-(\w+)-(\w+(?:-\w+)*))\b,');
6
7// Compatibilite pour 1.92 : on a besoin de sql_fetch et table_objet_sql
8if ($GLOBALS['spip_version_code'] < '1.93' AND $f = charger_fonction('compat_crayons', 'inc'))
9        $f();
10
11// Autoriser les crayons sur les tables non SPIP ?
12// Par defaut : oui (pour les admins complets, si autoriser_defaut_dist()) ;
13// mettre a false en cas de mutualisation par prefixe de table,
14// sinon on ne peut pas garantir que les sites sont hermetiques
15define('_CRAYONS_TABLES_EXTERNES', true);
16
17// Autorisations non prevues par le core
18include_spip('inc/autoriser');
19
20include_spip('inc/crayons-json');
21
22// table spip_meta, non ; sauf quelques-uns qu'on teste autoriser(configurer)
23// Attention sur les SPIP < 11515 inc/autoriser passe seulement
24// intval($id) alors qu'ici la cle est une chaine...
25if (!function_exists('autoriser_meta_modifier_dist')) {
26        function autoriser_meta_modifier_dist($faire, $type, $id, $qui, $opt) {
27                if (in_array("$id", array(
28                        'nom_site', 'slogan_site', 'descriptif_site', 'email_webmaster'
29                )))
30                        return autoriser('configurer', null, null, $qui);
31                else
32                        return false;
33        }
34}
35
36// table spip_messages, la c'est tout simplement non (peut mieux faire,
37// mais c'est a voir dans le core/organiseur ou dans autorite)
38if (defined('_DIR_PLUGIN_ORGANISEUR'))
39        include_spip('organiseur_autoriser');
40if (!function_exists('autoriser_message_modifier_dist')) {
41        function autoriser_message_modifier_dist($faire, $type, $id, $qui, $opt) {
42                return false;
43        }
44}
45//compat 192 documents
46if ($GLOBALS['spip_version_code'] < '1.93'){
47        if (!function_exists('get_spip_doc')){
48                        function get_spip_doc($fichier) {
49                                        // fichier distant
50                                        if (preg_match(',^\w+://,', $fichier))
51                                                        return $fichier;
52
53                                        // gestion d'erreurs, fichier=''
54                                        if (!strlen($fichier))
55                                                        return false;
56
57                                        // fichier normal
58                                        return (strpos($fichier, _DIR_IMG) === false)
59                                        ? _DIR_IMG . $fichier
60                                        : $fichier;
61                   }
62        }
63}
64
65// Autoriser l'usage des crayons ?
66function autoriser_crayonner_dist($faire, $type, $id, $qui, $opt) {
67        // Le type pouvant etre une table, verifier les autoriser('modifier')
68        // correspondant ; ils demandent le nom de l'objet: spip_articles => article
69        // ex: spip_articles => 'article'
70        $type = preg_replace(',^spip_(.*?)s?$,', '\1', $type);
71        if (strlen($GLOBALS['table_prefix']))
72                $type = preg_replace(',^'.$GLOBALS['table_prefix'].'_(.*?)s?$,', '\1', $type);
73
74        // Tables non SPIP ? Si elles sont interdites il faut regarder
75        // quelle table on appelle, et verifier si elle est "interne"
76        if (!_CRAYONS_TABLES_EXTERNES) {
77                include_spip('base/serial');
78                include_spip('base/auxiliaires');
79                include_spip('public/parametrer');
80                if (!isset($GLOBALS['tables_principales']['spip_'.table_objet($type)])
81                AND !isset($GLOBALS['tables_auxiliaires']['spip_'.table_objet($type)]))
82                        return false;
83        }
84
85        // Traduire le modele en liste de champs
86        if (isset($opt['modele']))
87                $opt['champ'] = $opt['modele'];
88
89        // Pour un auteur, si le champ est statut ou email, signaler l'option
90        // ad hoc (cf. inc/autoriser)
91        if ($type == 'auteur'
92        AND in_array($opt['champ'], array('statut', 'email')))
93                $opt[$opt['champ']] = true;
94
95        return (
96                 autoriser('modifier', $type, $id, $qui, $opt)
97        );
98}
99
100// Si un logo est demande, on renvoie la date dudit logo (permettra de gerer
101// un "modifie par ailleurs" si la date a change, rien de plus)
102function valeur_champ_logo($table, $id, $champ) {
103        $chercher_logo = charger_fonction('chercher_logo', 'inc');
104        $on = $chercher_logo($id, id_table_objet($table), 'on');
105        return $on ? filemtime($on[0]) : false;
106}
107
108// Idem : si un doc est demande, on renvoie la date du doc
109function valeur_champ_document($table, $id, $champ) {
110        $s = spip_query("SELECT date FROM spip_documents WHERE id_document="._q($id));
111        if ($t = sql_fetch($s))
112                return $t['date'];
113}
114
115function valeur_champ_vignette($table, $id, $champ) {
116        $vignette = sql_getfetsel('id_vignette','spip_documents','id_document='.intval($id));
117        if(is_numeric($vignette) && ($vignette > 0)){
118                $date = sql_getfetsel('date','spip_documents','id_document='.intval($vignette));
119        }
120        return $date ? $date : false;
121}
122// cette fonction de revision recoit le fichier upload a passer en logo
123// en reference : le nom du widget, pour aller chercher d'autres donnees
124// (ex: supprimer)
125function logo_revision($id, $file, $type, $ref) {
126
127        $chercher_logo = charger_fonction('chercher_logo', 'inc');
128        $_id_objet = id_table_objet($type);
129
130        // Chargement d'un nouveau logo ?
131        if ($file['logo']) {
132                define('FILE_UPLOAD', true); // message pour crayons_json_export :(
133
134                // supprimer l'ancien logo
135                $on = $chercher_logo($id, $_id_objet, 'on');
136                if ($on) @unlink($on[0]);
137
138                // ajouter le nouveau
139                include_spip('action/iconifier');
140                action_spip_image_ajouter_dist(
141                        type_du_logo($_id_objet).'on'.$id, false, false
142                ); // beurk
143        }
144
145        else
146
147        // Suppression du logo ?
148        if ($wid = array_pop($ref)
149        AND $_POST['content_'.$wid.'_logo_supprimer'] == 'on') {
150                if ($on = $chercher_logo($id, $_id_objet, 'on'))
151                        @unlink($on[0]);
152        }
153
154
155        // Reduire le logo ?
156        if (is_array($cfg = @unserialize($GLOBALS['meta']['crayons']))
157        AND $max = intval($cfg['reduire_logo'])) {
158                $on = $chercher_logo($id, $_id_objet, 'on');
159                include_spip('inc/filtres');
160                @copy($on[0], $temp = _DIR_VAR.'tmp'.rand(0,999).'.'.$on[3]);
161                $img1 = filtrer('image_reduire', $temp, $max);
162                $img2 = preg_replace(',[?].*,', '', extraire_attribut($img1, 'src'));
163                if (@file_exists($img2)
164                AND $img2 !=  $temp) {
165                        @unlink($on[0]);
166                        $dest = $on[1].$on[2].'.'
167                                .preg_replace(',^.*\.(gif|jpg|png)$,', '\1', $img2);
168                        @rename($img2,$dest);
169                }
170                @unlink($temp);
171        }
172
173        return true;
174}
175
176
177// cette fonction de revision recoit le fichier upload a passer en document
178function document_fichier_revision($id, $data, $type, $ref) {
179
180        $s = spip_query("SELECT * FROM spip_documents WHERE id_document="._q($id));
181        if (!$t = sql_fetch($s))
182                return false;
183
184        /*
185        // Envoi d'une URL de document distant ?
186        // TODO: verifier l'extension distante, sinon tout explose
187        if ($data['fichier']
188        AND preg_match(',^(https?|ftp)://.+,', $data['fichier'])) {
189                include_spip('inc/modifier');
190                modifier_contenu('document', $id,
191                        array('champs' => array('fichier', 'distant')),
192                        array('fichier' => $data['fichier'], 'distant' => 'oui')
193                );
194                return true;
195        }
196        else
197        */
198
199        // Chargement d'un nouveau doc ?
200        if ($data['document']) {
201
202                $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
203                $arg = $data['document'];
204                check_upload_error($arg['error']);
205                $x = $ajouter_documents($arg['tmp_name'], $arg['name'],
206                        'article', 0, 'document', null, $actifs);
207
208                // $actifs contient l'id_document nouvellement cree
209                // on recopie les donnees interessantes dans l'ancien
210                $extension=", extension ";
211                //compat 192
212                if ($GLOBALS['spip_version_code'] < '1.93')
213                        $extension="";
214
215                if ($id_new = array_pop($actifs)
216                AND $s = spip_query("SELECT fichier, taille, largeur, hauteur $extension, distant FROM spip_documents
217                        WHERE id_document="._q($id_new))
218                AND $new = sql_fetch($s)) {
219                        define('FILE_UPLOAD', true); // message pour crayons_json_export :(
220
221                        // Une vignette doit rester une image
222                        if ($t['mode'] == 'vignette'
223                        AND !in_array($new['extension'], array('jpg', 'gif', 'png')))
224                                return false;
225
226                        // Maintenant on est bon, on recopie les nouvelles donnees
227                        // dans l'ancienne ligne spip_documents
228                        include_spip('inc/modifier');
229                        modifier_contenu('document', $id,
230                                # 'champs' inutile a partir de SPIP 11348
231                                array('champs' => array_keys($new)),
232                                $new);
233
234                        // supprimer l'ancien document (sauf s'il etait distant)
235                        if ($t['distant'] != 'oui'
236                        AND file_exists(get_spip_doc($t['fichier'])))
237                                supprimer_fichier(get_spip_doc($t['fichier']));
238
239                        // Effacer la ligne temporaire de spip_document
240                        spip_query("DELETE FROM spip_documents WHERE id_document="._q($id_new));
241
242                        // oublier id_document temporaire (ca marche chez moi, sinon bof)
243                        spip_query("ALTER TABLE spip_documents AUTO_INCREMENT="._q($id_new));
244
245                        return true;
246                }
247        }
248
249}
250
251// cette fonction de revision soit supprime la vignette d'un document,
252// soit recoit le fichier upload a passer ou remplacer la vignette du document
253function vignette_revision($id, $data, $type, $ref) {
254        $s = sql_fetsel("*","spip_documents","id_document=".intval($id));
255        if (!is_array($s))
256                return false;
257
258        include_spip('inc/modifier');
259        include_spip('inc/documents');
260        // Chargement d'un nouveau doc ?
261        if ($data['vignette']) {
262                define('FILE_UPLOAD', true);
263                if(is_numeric($s['id_vignette']) && ($s['id_vignette']>0)){
264                        spip_log('suppression de la vignette');
265                        // Suppression du document
266                        $vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document='.intval($s['id_vignette']));
267                        if (@file_exists($f = get_spip_doc($vignette))) { 
268                                spip_log("efface $f"); 
269                                supprimer_fichier($f); 
270                        }
271                        sql_delete('spip_documents', 'id_document='.intval($s['id_vignette']));
272                        sql_delete('spip_documents_liens',  'id_document='.intval($s['id_vignette']));
273
274                        pipeline('post_edition',
275                                array(
276                                        'args' => array(
277                                                'operation' => 'supprimer_document',
278                                                'table' => 'spip_documents',
279                                                'id_objet' => $s['id_vignette']
280                                        ),
281                                        'data' => null
282                                )
283                        );
284                       
285                        // On remet l'id_vignette a 0
286                        revision_document($s['id_document'], array('id_vignette'=>0));
287                }
288                // Ajout du document comme vignette
289                $ajouter_documents = charger_fonction('ajouter_documents', 'inc');
290                $arg = $data['vignette'];
291                check_upload_error($arg['error']);
292                $x = $ajouter_documents($arg['tmp_name'], $arg['name'],'','', 'vignette', $id, $actifs);
293        }else
294                // Suppression de la vignette ?
295                if ($wid = array_pop($ref)
296                        AND $_POST['content_'.$wid.'_vignette_supprimer'] == 'on') {
297                        if(is_numeric($s['id_vignette']) && ($s['id_vignette']>0)){
298                                // Suppression du document
299                                $vignette = sql_getfetsel('fichier', 'spip_documents', 'id_document='.intval($s['id_vignette']));
300                                if (@file_exists($f = get_spip_doc($vignette))) { 
301                                        spip_log("efface $f"); 
302                                        supprimer_fichier($f); 
303                                }
304                                sql_delete('spip_documents', 'id_document='.intval($s['id_vignette']));
305                                sql_delete('spip_documents_liens',  'id_document='.intval($s['id_vignette']));
306                               
307                                pipeline('post_edition',
308                                        array(
309                                                'args' => array(
310                                                        'operation' => 'supprimer_document',
311                                                        'table' => 'spip_documents',
312                                                        'id_objet' => $s['id_vignette']
313                                                ),
314                                                'data' => null
315                                        )
316                                );
317                               
318                                // On remet l'id_vignette a 0
319                                revision_document($s['id_document'], array('id_vignette'=>0));
320                        }
321                }
322        return true;
323}
324
325function colonne_table($type, $col) {
326        list($distant,$table) = distant_table($type);
327        $nom_table = '';
328        if (!(($tabref = &crayons_get_table($table, $nom_table)) && ($brut = $tabref['field'][$col]))) {
329                return false;
330        }
331        $ana = explode(' ', $brut);
332        $sta = 0;
333        $sep = '';
334        $ret = array('brut' => $brut,
335                'type' => '', 'notnull' => false, 'long' => 0, 'def' => '');
336        foreach ($ana as $mot) {
337                switch ($sta) {
338                        case 0: $ret['type'] = ($mot = strtolower($mot));
339                        case 1: if ($mot[strlen($mot) - 1] == ')') {
340                                        $pos = strpos($mot, '(');
341                                        $ret['type'] = strtolower(substr($mot, 0, $pos++));
342                                        $vir = explode(',', substr($mot, $pos, -1));
343                                        if ($ret['type'] == 'enum') {
344                                                $ret['enum'] = $vir;
345                                        } elseif (count($vir) > 1) {
346                                                $ret['long'] = $vir;
347                                        } else {
348                                                $ret['long'] = $vir[0];
349                                        }
350                                        $sta = 1;
351                                        continue;
352                                }
353                                if (!$sta) {
354                                        $sta = 1;
355                                        continue;
356                                }
357                        case 2: switch (strtolower($mot)) {
358                                case 'not':
359                                        $sta = 3;
360                                        continue;
361                                case 'default':
362                                        $sta = 4;
363                                        continue;
364                                }
365                                continue;
366                        case 3:         $ret['notnull'] = strtolower($mot) == 'null';
367                                $sta = 2;
368                                continue;
369                        case 4: $df1 = strpos('"\'', $mot[0]) !== false? $mot[0] : '';
370                                $sta = 5;
371                        case 5: $ret['def'] .= $sep . $mot;
372                                if (!$df1) {
373                                        $sta = 2;
374                                        continue;
375                                }
376                                if ($df1 == $mot[strlen($mot) - 1]) {
377                                        $ret['def'] = substr($ret['def'], 1, -1);
378                                        $sta = 2;
379                                }
380                                $sep = ' ';
381                                continue;
382                }
383        }
384        return $ret;
385}
386//      var_dump(colonne_table('forum', 'id_syndic')); die();
387
388function table_where($type, $id, $where_en_tableau = false)
389{
390        list($distant,$table) = distant_table($type);
391        $nom_table = '';
392        if (!(($tabref = &crayons_get_table($type, $nom_table))
393                        && ($tabid = explode(',', $tabref['key']['PRIMARY KEY'])))) {
394                spip_log('crayons: table ' . $table . ' inconnue');
395                return array(false, false);
396        }
397        if (is_scalar($id)) {
398                $id = explode('-', $id);
399        }
400        // sortie tableau pour sql_updateq
401        if ($where_en_tableau) {
402                $where = array();
403                foreach ($id as $idcol => $idval) {
404                        $where[] = '`' . (is_int($idcol) ? trim($tabid[$idcol]) : $idcol) . '`=' . sql_quote($idval);
405                }
406        // sinon sortie texte pour sql_query
407        } else {
408                $where = $and = '';
409                foreach ($id as $idcol => $idval) {
410                        $where .= $and . '`' . (is_int($idcol) ? trim($tabid[$idcol]) : $idcol) . '`=' . _q($idval);
411                        $and = ' AND ';
412                }
413        }
414        return array($nom_table, $where);
415}
416//      var_dump(colonne_table('forum', 'id_syndic')); die();
417
418function valeur_colonne_table_dist($type, $col, $id) {
419        list($distant,$table) = distant_table($type);
420        list($nom_table, $where) = table_where($type, $id);
421
422        if (!$nom_table)
423                return false;
424
425        $r = array();
426
427        // valeurs non SQL
428        foreach ($col as $champ) {
429                if (function_exists($f = 'valeur_champ_'.$table.'_'.$champ) OR function_exists($f = 'valeur_champ_'.$champ)) {
430                        $r[$champ] = $f($table, $id, $champ);
431                        $col = array_diff($col, array($champ));
432                }
433        }
434
435        // valeurs SQL
436        if (count($col)
437        AND $s = spip_query(
438                        'SELECT `' . implode($col, '`, `') .
439                        '` FROM ' . $nom_table . ' WHERE ' . $where, $distant)
440        AND $t = sql_fetch($s))
441                $r = array_merge($r, $t);
442
443        return $r;
444}
445
446function valeur_colonne_table($table, $col, $id) {
447        if (!is_array($col))
448                $col = array($col);
449
450        if (function_exists($f = $table.'_valeur_colonne_table_dist')
451        OR function_exists($f = $table.'_valeur_colonne_table')
452        OR $f = 'valeur_colonne_table_dist')
453                return $f($table, $col, $id);
454}
455
456function return_log($var) {
457        die(crayons_json_export(array('$erreur'=> var_export($var,true))));
458}
459
460function _U($texte, $params=array())
461{
462    include_spip('inc/charsets');
463    return unicode2charset(html2unicode(_T($texte, $params)));
464}
465
466// wdgcfg = widget config :-)
467function wdgcfg() {
468        $php = function_exists('crayons_config') ? crayons_config() : array();
469        include_spip('inc/meta');
470        lire_metas();
471        global $meta;
472        $metacrayons = empty($meta['crayons']) ? array() : unserialize($meta['crayons']);
473        $wdgcfg = array();
474        foreach (array(
475                'msgNoChange' => false,
476                'msgAbandon' => false,  /* etait: true */
477                'filet' => false,
478                'yellow_fade' => false,
479                'clickhide' => false /* etait: true */
480        )
481        as $cfgi => $def) {
482                $wdgcfg[$cfgi] = isset($php[$cfgi]) ? $php[$cfgi] :
483                        isset($metacrayons[$cfgi]) ? $metacrayons[$cfgi] : $def;
484        }
485        return $wdgcfg;
486}
487
488function &crayons_get_table($type, &$nom_table) {
489        list($distant,$table) = distant_table($type);
490        static $return = array();
491        static $noms = array();
492        if (!isset($return[$table])) {
493                $try = array(table_objet_sql($table), 'spip_'.table_objet($table), 'spip_' . $table . 's', $table . 's', 'spip_' . $table, $table);
494
495                // premiere possibilite (1.9.3) : regarder directement la base
496                if (function_exists('sql_showtable')) {
497                        foreach ($try as $nom) {
498                                if ($q = sql_showtable($nom , !$distant , $distant)) {
499                                        $noms[$table] = $nom;
500                                        $return[$table] = $q;
501                                }
502                        }
503                }
504
505                // seconde, une heuristique 1.9.2
506                if (!isset($return[$table])) {
507                        include_spip('base/serial');
508                        include_spip('base/auxiliaires');
509                        include_spip('public/parametrer');
510                        foreach(array('tables_principales', 'tables_auxiliaires') as $categ)
511                        {
512                                foreach ($try as $nom) {
513                                        if (isset($GLOBALS[$categ][$nom])) {
514                                                $noms[$table] = $nom;
515                                                $return[$table] = & $GLOBALS[$categ][$nom];
516                                                break 2;
517                                        }
518                                }
519                        }
520                }
521
522        }
523
524        $nom_table = $noms[$table];
525        return $return[$table];
526}
527
528function distant_table($type) {
529        //separation $type en $distant $table
530        //separateur double underscore "__"
531        strstr($type,'__')? list($distant,$table) = explode('__',$type) : list($distant,$table) = array(False,$type);
532        return array($distant,$table);
533}
534?>
Note: See TracBrowser for help on using the repository browser.