source: spip-zone/_plugins_branche_stable_/_spip_1_9_1_/Forms/inc/forms.php @ 5413

Last change on this file since 5413 was 5413, checked in by renato@…, 15 years ago

i18n of form plugin. Translation in Italian. Fix info box about answers when editing a form

File size: 18.6 KB
Line 
1<?php
2/*
3 * forms
4 * version plug-in de spip_form
5 *
6 * Auteur :
7 * Antoine Pitrou
8 * adaptation en 182e puis plugin par cedric.morin@yterium.com
9 * © 2005,2006 - Distribue sous licence GNU/GPL
10 *
11 */
12
13
14        function Forms_install(){
15                Form_verifier_base();
16        }
17       
18        function Forms_uninstall(){
19                include_spip('base/forms');
20                include_spip('base/abstract_sql');
21        }
22       
23        function Forms_verifier_base(){
24                $version_base = 0.15;
25                $current_version = 0.0;
26                if (   (isset($GLOBALS['meta']['forms_base_version']) )
27                                && (($current_version = $GLOBALS['meta']['forms_base_version'])==$version_base))
28                        return;
29
30                include_spip('base/forms');
31                if ($current_version==0.0){
32                        include_spip('base/create');
33                        include_spip('base/abstract_sql');
34                        // attention on vient peut etre d'une table spip-forms 1.8
35                        $desc = spip_abstract_showtable('spip_forms','',true);
36                        if (isset($desc['field'])) 
37                                $current_version=0.1;
38                        else {
39                                creer_base();
40                                ecrire_meta('forms_base_version',$current_version=$version_base);
41                        }
42                }
43                if ($current_version<0.11){
44                        include_spip('base/create');
45                        include_spip('base/abstract_sql');
46                        creer_base();
47                        $query = "ALTER TABLE spip_forms CHANGE `email` `email` TEXT NOT NULL ";
48                        $res = spip_query($query);
49                        $query = "SELECT * FROM spip_forms";
50                        $res = spip_query($query);
51                        while ($row = spip_fetch_array($res)){
52                                $email = $row['email'];
53                                $id_form = $row['id_form'];
54                                if (unserialize($email)==FALSE){
55                                        $email=addslashes(serialize(array('defaut'=>$email)));
56                                        $query = "UPDATE spip_forms SET email='$email' WHERE id_form=$id_form";
57                                        spip_query($query);
58                                }
59                        }
60                        ecrire_meta('forms_base_version',$current_version=0.11);
61                }
62                if ($current_version<0.12){
63                        include_spip('base/create');
64                        include_spip('base/abstract_sql');
65                        creer_base();
66                        spip_query("ALTER TABLE spip_forms CHANGE `descriptif` `descriptif` TEXT");
67                        spip_query("ALTER TABLE spip_forms CHANGE `schema` `schema` TEXT");
68                        spip_query("ALTER TABLE spip_forms CHANGE `email` `email` TEXT");
69                        spip_query("ALTER TABLE spip_forms CHANGE `texte` `texte` TEXT");
70                        ecrire_meta('forms_base_version',$current_version=0.12);
71                }
72                if ($current_version<0.13){
73                        spip_query("ALTER TABLE spip_forms CHANGE `schema` `structure` TEXT");
74                        ecrire_meta('forms_base_version',$current_version=0.13);
75                }
76                if ($current_version<0.14){
77                        spip_query("ALTER TABLE spip_reponses ADD `id_article_export` BIGINT( 21 ) NOT NULL AFTER `id_auteur` ");
78                        ecrire_meta('forms_base_version',$current_version=0.14);
79                }
80                if ($current_version<0.15){
81                        spip_query("ALTER TABLE spip_reponses ADD `url` VARCHAR(255) NOT NULL AFTER `id_article_export` ");
82                        ecrire_meta('forms_base_version',$current_version=0.15);
83                }
84                ecrire_metas();
85        }
86
87        function Forms_deplacer_fichier_form($source, $dest) {
88                // Securite
89                if (strstr($dest, "..")) {
90                        exit;
91                }
92       
93                $ok = @rename($source, $dest);
94                if (!$ok) $ok = @move_uploaded_file($source, $dest);
95                if ($ok)
96                        @chmod($dest, 0666);
97                else {
98                        @unlink($source);
99                }
100       
101                return $ok;
102        }
103
104        function Forms_nommer_fichier_form($orig, $dir) {
105                include_spip("inc/charsets");
106                include_spip("inc/filtres");
107                if (ereg("^(.*)\.([^.]+)$", $orig, $match)) {
108                        $ext = strtolower($match[2]);
109                        $orig = $match[1];
110                }
111                $base = ereg_replace("[^.a-zA-Z0-9_=-]+", "_", 
112                        translitteration(supprimer_tags(basename($orig))));
113                $n = 0;
114                $fichier = $base.'.'.$ext;
115                while (@file_exists($dir . $fichier)) {
116                        $fichier = $base.'-'.(++$n).'.'.$ext;
117                }
118                return $fichier;
119        }
120
121        function Forms_type_fichier_autorise($nom_fichier) {
122                if (ereg("\.([^.]+)$", $nom_fichier, $match)) {
123                        $ext = addslashes(strtolower($match[1]));
124                        switch ($ext) {
125                        case 'htm':
126                                $ext = 'html';
127                                break;
128                        case 'jpeg':
129                                $ext = 'jpg';
130                                break;
131                        case 'tiff':
132                                $ext = 'tif';
133                                break;
134                        }
135                        $query = "SELECT * FROM spip_types_documents WHERE extension='$ext' AND upload='oui'";
136                        $result = spip_query($query);
137                        return (spip_num_rows($result) > 0);
138                }
139                return false;
140        }
141
142        // Fonction utilitaires
143        function Forms_form_editable($id_form = 0) {
144                global $connect_statut;
145                return $connect_statut == '0minirezo';
146        }
147       
148        function Forms_form_administrable($id_form = 0) {
149                global $connect_statut;
150                return $connect_statut == '0minirezo';
151        }
152
153        function Forms_nom_cookie_form($id_form) {
154                return $GLOBALS['cookie_prefix'].'cookie_form_'.$id_form;
155        }
156
157        function Forms_verif_cookie_sondage_utilise($id_form) {
158                //var_dump($_COOKIE);
159                $cookie_utilise=true;
160                $nom_cookie = Forms_nom_cookie_form($id_form);
161                // Ne generer un nouveau cookie que s'il n'existe pas deja
162                if (!$cookie = addslashes($GLOBALS['cookie_form'])){
163                        if (!$cookie = $_COOKIE[$nom_cookie]) {
164                        $cookie_utilise=false;  // pas de cookie a l'horizon donc pas de reponse presumée
165                                //include_spip("inc/session");
166                                //$cookie = creer_uniqid();
167                        }
168                }
169                $query = "SELECT id_reponse FROM spip_reponses ".
170                        "WHERE id_form=$id_form AND cookie='".addslashes($cookie)."'";
171                if (!spip_num_rows(spip_query($query)))
172                  $cookie_utilise=false;  // cet utilisateur n'a pas deja repondu !
173                return $cookie_utilise;
174        }
175
176        //
177        // Afficher un pave formulaires dans la colonne de gauche
178        // (edition des articles)
179       
180        function Forms_afficher_insertion_formulaire($id_article) {
181                global $connect_id_auteur, $connect_statut;
182                global $couleur_foncee, $couleur_claire, $options;
183                global $spip_lang_left, $spip_lang_right;
184       
185                $s = "";
186                // Ajouter un formulaire
187                $s .= "\n<p>";
188                $s .= debut_cadre_relief("../"._DIR_PLUGIN_FORMS."/img_pack/form-24.png", true);
189       
190                $s .= "<div style='padding: 2px; background-color: $couleur_claire; text-align: center; color: black;'>";
191                $s .= bouton_block_invisible("ajouter_form");
192                $s .= "<strong class='verdana3' style='text-transform: uppercase;'>"
193                        ._T("forms:article_inserer_un_formulaire")."</strong>";
194                $s .= "</div>\n";
195       
196                $s .= debut_block_invisible("ajouter_form");
197                $s .= "<div class='verdana2'>";
198                $s .= _T("forms:article_inserer_un_formulaire_detail");
199                $s .= "</div>";
200       
201                $query = "SELECT id_form, titre FROM spip_forms ORDER BY titre";
202                $result = spip_query($query);
203                if (spip_num_rows($result)) {
204                        $s .= "<br />\n";
205                        $s .= "<div class='bandeau_rubriques' style='z-index: 1;'>";
206                        $s .= "<div class='plan-articles'>";
207                        while ($row = spip_fetch_array($result)) {
208                                $id_form = $row['id_form'];
209                                $titre = typo($row['titre']);
210                               
211                                $link = generer_url_ecrire('forms_edit',"id_form=$id_form&retour=".urlencode(self()));
212                                $s .= "<a href='".$link."'>";
213                                $s .= $titre."</a>\n";
214                                $s .= "<div class='arial1' style='text-align:$spip_lang_right;color: black; padding-$spip_lang_left: 4px;' "."title=\""._T("forms:article_recopier_raccourci")."\">";
215                                $s .= "<strong>&lt;form".$id_form."&gt;</strong>";
216                                $s .= "</div>";
217                        }
218                        $s .= "</div>";
219                        $s .= "</div>";
220                }
221       
222                // Creer un formulaire
223                if (Forms_form_editable()) {
224                        $s .= "\n<br />";
225                        $link = generer_url_ecrire('forms_edit',"new=oui&retour=".urlencode(self()));
226                        $s .= icone_horizontale(_T("forms:icone_creer_formulaire"),
227                                $link, "../"._DIR_PLUGIN_FORMS."/img_pack/form-24.png", "creer.gif", false);
228                }
229       
230                $s .= fin_block();
231       
232                $s .= fin_cadre_relief(true);
233                return $s;
234        }
235
236        function Forms_nom_type_champ($type) {
237                static $noms;
238                if (!$noms) {
239                        $noms = array(
240                                'ligne' => _T("forms:champ_type_ligne"),
241                                'texte' => _T("forms:champ_type_texte"),
242                                'url' => _T("forms:champ_type_url"),
243                                'email' => _T("forms:champ_type_email"),
244                                'select' => _T("forms:champ_type_select"),
245                                'multiple' => _T("forms:champ_type_multiple"),
246                                'fichier' => _T("forms:champ_type_fichier"),
247                                'mot' => _T("forms:champ_type_mot"),
248                                'separateur' => _T("forms:champ_type_separateur"),
249                                'textestatique' => _T("forms:champ_type_textestatique")
250                        );
251                }
252                return ($s = $noms[$type]) ? $s : $type;
253        }
254
255        function Forms_types_champs_autorises($type = '') {
256                static $t;
257                if (!$t) {
258                        $t = array_flip(array('ligne', 'texte', 'url', 'email', 'select', 'multiple', 'fichier', 'mot','separateur','textestatique'));
259                }
260                return $type ? isset($t[$type]) : $t;
261        }
262
263        function Forms_generer_mail_reponse_formulaire($id_form, $id_reponse){
264                $result = spip_query("SELECT * FROM spip_forms WHERE id_form=$id_form");
265                if ($row = spip_fetch_array($result)) {
266                        $corps_mail = recuperer_fond('modeles/reponse_email',array('id_reponse'=>$id_reponse));
267                        $corps_mail_admin = recuperer_fond('modeles/reponse_email',array('id_reponse'=>$id_reponse,'mail_admin'=>'oui'));
268                        $champconfirm = $row['champconfirm'];
269                        $email = unserialize($row['email']);
270                        $email_dest = $email['defaut'];
271                        $mailconfirm = "";
272                       
273                        // recuperer l'email de confirmation
274                        $result2 = spip_query("SELECT * FROM spip_reponses_champs WHERE id_reponse='$id_reponse' AND champ=".spip_abstract_quote($champconfirm));
275                        if ($row2 = spip_fetch_array($result2)) {
276                                $mailconfirm = $row2['valeur'];
277                        }
278
279                        // recuperer l'email d'admin
280                        $result2 = spip_query("SELECT * FROM spip_reponses_champs WHERE id_reponse='$id_reponse' AND champ=".spip_abstract_quote($email['route']));
281                        if ($row2 = spip_fetch_array($result2)) {
282                                if (isset($email[$row2['valeur']]))
283                                        $email_dest = $email[$row2['valeur']];
284                        }
285
286                        include_spip('inc/charset');
287                        $trans_tbl = get_html_translation_table (HTML_ENTITIES);
288                        $trans_tbl = array_flip ($trans_tbl);
289                        if ($mailconfirm !== '') {
290                                $head="From: formulaire@".$_SERVER["HTTP_HOST"]."\n";
291                                $sujet = $row['titre'];
292                                $dest = $mailconfirm;
293                               
294                                // mettre le texte dans un charset acceptable
295                                $mess_iso = unicode2charset(charset2unicode($corps_mail),'iso-8859-1');
296                                // regler les entites si il en reste
297                                $mess_iso = strtr($mess_iso, $trans_tbl);
298
299                                mail($dest, $sujet, $mess_iso, $head);
300                        }
301                        if ($email_dest != '') {
302                                $head="From: formulaire_$id_form@".$_SERVER["HTTP_HOST"]."\n";
303                                $sujet = $row['titre'];
304                                $dest = $email_dest;
305                               
306                                // mettre le texte dans un charset acceptable
307                                $mess_iso = unicode2charset(charset2unicode($corps_mail_admin),'iso-8859-1');
308                                // regler les entites si il en reste
309                                $mess_iso = strtr($mess_iso, $trans_tbl);
310                               
311                                mail($dest, $sujet, $mess_iso, $head);
312                        }
313                }
314        }
315
316        function Forms_enregistrer_reponse_formulaire($id_form, &$erreur, &$reponse, $script_validation = 'valide_form', $script_args='') {
317                $erreur = '';
318                $reponse = '';
319                $r = '';
320       
321                $query = "SELECT * FROM spip_forms WHERE id_form=$id_form";
322                $result = spip_query($query);
323                if (!$row = spip_fetch_array($result)) {
324                        $erreur['@'] = _T("forms:probleme_technique");
325                }
326                // Extraction des donnees pour l'envoi des mails eventuels
327                //   accuse de reception et forward webmaster
328                $email = unserialize($row['email']);
329                $champconfirm = $row['champconfirm'];
330                $mailconfirm = '';
331       
332                $structure = unserialize($row['structure']);
333                // Ici on parcourt les valeurs entrees pour les champs demandes
334                foreach ($structure as $index => $t) {
335                        $code = $t['code'];
336                        $type = $t['type'];
337                        $type_ext = $t['type_ext'];
338                        $val = $GLOBALS[$code];
339                        if (!$val || ($type == 'fichier' && !$_FILES[$code]['tmp_name'])) {
340                                if ($t['obligatoire'] == 'oui')
341                                        $erreur[$code] = _T("forms:champ_necessaire");
342                                continue;
343                        }
344                        // Verifier la conformite des donnees entrees
345                        if ($type == 'email') {
346                                if (!strpos($val, '@') || !email_valide($val)) {
347                                        $erreur[$code] = _T("forms:adresse_invalide");
348                                }
349                        }
350                        if ($type == 'url') {
351                                if ($t['verif'] == 'oui') {
352                                        include_spip("inc/sites");
353                                        if (!recuperer_page($val)) {
354                                                $erreur[$code] = _T("forms:site_introuvable");
355                                        }
356                                }
357                        }
358                        if ($type == 'fichier') {
359                                if (!$taille = $_FILES[$code]['size']) {
360                                        $erreur[$code] = _T("forms:echec_upload");
361                                }
362                                else if ($type_ext['taille'] && $taille > ($type_ext['taille'] * 1024)) {
363                                        $erreur[$code] = _T("forms:fichier_trop_gros");
364                                }
365                                else if (!Forms_type_fichier_autorise($_FILES[$code]['name'])) {
366                                        $erreur[$code] = _T("fichier_type_interdit");
367                                }
368                                if ($erreur[$code]) {
369                                        supprimer_fichier($_FILES[$code]['tmp_name']);
370                                }
371                        }
372                }
373       
374                // Si tout est bon, enregistrer la reponse
375                if (!$erreur) {
376                        global $auteur_session;
377                        $id_auteur = $auteur_session ? intval($auteur_session['id_auteur']) : 0;
378                        $ip = addslashes($GLOBALS['REMOTE_ADDR']);
379                        $url = parametre_url(self(),'id_form','');
380                        $ok = true;
381                       
382                        if ($row['sondage'] != 'non') {
383                                $statut = 'attente';
384                                $cookie = addslashes($GLOBALS['cookie_form']);
385                                $nom_cookie = Forms_nom_cookie_form($id_form);
386                        }
387                        else {
388                                $statut = 'valide';
389                                $cookie = '';
390                        }
391                        // D'abord creer la reponse dans la base de donnees
392                        if ($ok) {
393                                $query = "INSERT INTO spip_reponses (id_form, id_auteur, date, ip, url, statut, cookie) ".
394                                        "VALUES ($id_form, '$id_auteur', NOW(), '$ip', ".spip_abstract_quote($url).", '$statut', '$cookie')";
395                                spip_query($query);
396                                $id_reponse = spip_insert_id();
397                                if (!$id_reponse) {
398                                        $erreur['@'] = _T("forms:probleme_technique");
399                                        $ok = false;
400                                }
401                        }
402                        // Puis enregistrer les differents champs
403                        if ($ok) {
404                                $inserts = array();
405                                foreach ($structure as $index => $t) {
406                                        $type = $t['type'];
407                                        $code = $t['code'];
408       
409                                        if ($type == 'fichier') {
410                                                if (!$val = $_FILES[$code] OR !$val['tmp_name']) continue;
411                                                // Fichier telecharge : deplacer dans IMG, stocker le chemin dans la base
412                                                $dir = sous_repertoire(_DIR_IMG, "protege");
413                                                $dir = sous_repertoire($dir, "form".$id_form);
414                                                $source = $val['tmp_name'];
415                                                $dest = $dir.Forms_nommer_fichier_form($val['name'], $dir);
416                                                if (!Forms_deplacer_fichier_form($source, $dest)) {
417                                                        $erreur[$code] = _T("forms:probleme_technique_upload");
418                                                        $ok = false;
419                                                }
420                                                else {
421                                                        $inserts[] = "($id_reponse, '$code', '".addslashes($dest)."')";
422                                                }
423                                        }
424                                        else {
425                                                if (!$val = $GLOBALS[$code]) continue;
426                                                // Choix multiples : enregistrer chaque valeur separement
427                                                else if (is_array($val)) {
428                                                        foreach ($val as $v) {
429                                                                $inserts[] = "($id_reponse, '$code', '".addslashes($v)."')";
430                                                        }
431                                                }
432                                                else {
433                                                        $inserts[] = "($id_reponse, '$code', '".addslashes($val)."')";
434                                                        if ($code == $champconfirm)
435                                                                $mailconfirm = $val;
436                                                }
437                                        }
438                                }
439       
440                                if (!count($inserts)) {
441                                        // Reponse vide => annuler
442                                        $erreur['@'] = _T("forms:remplir_un_champ");
443                                        $query = "DELETE FROM spip_reponses WHERE id_reponse=$id_reponse";
444                                        spip_query($query);
445                                        $ok = false;
446                                }
447                        }
448                        if ($ok) {
449                                $query = "INSERT INTO spip_reponses_champs (id_reponse, champ, valeur) ".
450                                        "VALUES ".join(',', $inserts);
451                                spip_query($query);
452                                if ($row['sondage'] != 'non') {
453                                        $hash = calculer_action_auteur("forms valide reponse sondage $id_reponse");
454                                        $url = generer_url_public($script_validation,"verif_cookie=oui&id_reponse=$id_reponse&hash=$hash".($script_args?"&$script_args":""));
455                                        $r = $url;
456                                }
457                                else if (($email) || ($mailconfirm)) {
458                                        $hash = calculer_action_auteur("forms confirme reponse $id_reponse");
459                                        $url = generer_url_public($script_validation,"mel_confirm=oui&id_reponse=$id_reponse&hash=$hash".($script_args?"&$script_args":""));
460                                        $r = $url;
461       
462                                        $reponse = $mailconfirm;
463                                }
464                        }
465                }
466       
467                return $r;
468        }
469
470        //
471        // Afficher une liste de formulaires
472        //
473       
474        function Forms_afficher_forms($titre_table, $requete, $icone = '') {
475                global $couleur_claire, $couleur_foncee;
476                global $connect_id_auteur;
477
478                $tous_id = array();
479               
480                $select = $requete['SELECT'] ? $requete['SELECT'] : '*';
481                $from = $requete['FROM'] ? $requete['FROM'] : 'spip_articles AS articles';
482                $join = $requete['JOIN'] ? (' LEFT JOIN ' . $requete['JOIN']) : '';
483                $where = $requete['WHERE'] ? (' WHERE ' . $requete['WHERE']) : '';
484                $order = $requete['ORDER BY'] ? (' ORDER BY ' . $requete['ORDER BY']) : '';
485                $group = $requete['GROUP BY'] ? (' GROUP BY ' . $requete['GROUP BY']) : '';
486                $limit = $requete['LIMIT'] ? (' LIMIT ' . $requete['LIMIT']) : '';
487       
488                $cpt = "$from$join$where$group";
489                $tmp_var = substr(md5($cpt), 0, 4);
490
491                if (!$group){
492                        $cpt = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM $cpt"));
493                        if (! ($cpt = $cpt['n'])) return $tous_id ;
494                }
495                else
496                        $cpt = spip_num_rows(spip_query("SELECT $select FROM $cpt"));
497                if ($requete['LIMIT']) $cpt = min($requete['LIMIT'], $cpt);
498       
499                $nb_aff = 1.5 * _TRANCHES;
500                $deb_aff = intval(_request('t_' .$tmp_var));
501       
502                if ($cpt > $nb_aff) {
503                        $nb_aff = (_TRANCHES); 
504                        $tranches = afficher_tranches_requete($cpt, 3, $tmp_var, '', $nb_aff);
505                }
506               
507                if (!$icone) $icone = "../"._DIR_PLUGIN_FORMS."/img_pack/form-24.png";
508               
509                if ($cpt) {
510                        if ($titre_table) echo "<div style='height: 12px;'></div>";
511                        echo "<div class='liste'>";
512                        bandeau_titre_boite2($titre_table, $icone, $couleur_claire, "black");
513                        echo "<table width='100%' cellpadding='5' cellspacing='0' border='0'>";
514       
515                        echo $tranches;
516       
517                        $result = spip_query("SELECT $select FROM $from$join$where$group$order LIMIT $deb_aff, $nb_aff");
518                        $num_rows = spip_num_rows($result);
519       
520                        $ifond = 0;
521                        $premier = true;
522                       
523                        $compteur_liste = 0;
524                        while ($row = spip_fetch_array($result)) {
525                                $vals = '';
526                                $id_form = $row['id_form'];
527                                $reponses = $row['reponses'];
528                                $titre = $row['titre'];
529
530                                $tous_id[] = $id_form;
531
532                                $retour = parametre_url(self(),'duplique_form','');
533                                $link = generer_url_ecrire('forms_edit',"id_form=$id_form&retour=".urlencode($retour));
534                                if ($reponses) {
535                                        $puce = 'puce-verte-breve.gif';
536                                }
537                                else {
538                                        $puce = 'puce-orange-breve.gif';
539                                }
540       
541                                $s = "<img src='"._DIR_IMG_PACK."$puce' width='7' height='7' border='0'>&nbsp;&nbsp;";
542                                $vals[] = $s;
543                               
544                                //$s .= typo($titre);
545                                $s = icone_horizontale(typo($titre), $link,"../"._DIR_PLUGIN_FORMS."/img_pack/form-24.png", "",false);
546                                $vals[] = $s;
547                               
548                                $s = "";
549                                $vals[] = $s;
550       
551                                $s = "";
552                                if ($reponses) {
553                                        $s .= _T("forms:nombre_reponses",array('nombre'=>$reponses));
554                                }
555                                $vals[] = $s;
556                               
557                                $s = "";
558                                if(Forms_form_administrable($id_form)){
559                                        $link = parametre_url(self(),'duplique_form',$id_form);
560                                        $vals[] = "<a href='$link'>"._T("forms:dupliquer")."</a>";
561                                }
562                                $vals[] = $s;
563
564                                $table[] = $vals;
565                        }
566                        spip_free_result($result);
567                       
568                        $largeurs = array('','','','','');
569                        $styles = array('arial11', 'arial11', 'arial1', 'arial1','arial1');
570                        echo afficher_liste($largeurs, $table, $styles);
571                        echo "</table>";
572                        echo "</div>\n";
573                }
574                return $tous_id;
575        }
576
577?>
Note: See TracBrowser for help on using the repository browser.