source: spip-zone/_plugins_/formidable/trunk/traiter/email.php @ 109634

Last change on this file since 109634 was 109634, checked in by nicolas.dorigny@…, 21 months ago

Ça ne pouvait pas marcher, vu que le tableau $corps est défini plus bas.

File size: 19.8 KB
Line 
1<?php
2
3// Sécurité
4if (!defined('_ECRIRE_INC_VERSION')) {
5        return;
6}
7include_spip('inc/utils');
8include_spip('inc/formidable_fichiers');
9
10function traiter_email_dist($args, $retours) {
11        if (!isset($retours['fichiers'])) {
12                $retours['fichiers'] = array();
13                $ajouter_fichier = true;
14        } else {
15                $ajouter_fichier = false;
16        }
17        $timestamp = time();
18        $retours['timestamp'] = $timestamp;
19        $formulaire = $args['formulaire'];
20        $options = $args['options'];
21        $saisies = unserialize($formulaire['saisies']);
22        $traitements = unserialize($formulaire['traitements']);
23        $champs = saisies_lister_champs($saisies);
24        $destinataires = array();
25        $taille_fichiers = 0; //taille des fichiers en email
26        $fichiers_facteur = array(); // tableau qui stockera les fichiers à envoyer avec facteur
27        if (isset($options['exclure_champs_email']) && $options['exclure_champs_email']) {
28                $champs_a_exclure = explode(",", $options['exclure_champs_email']);
29                $champs = array_diff($champs, $champs_a_exclure);
30                foreach ($champs_a_exclure as $champ_a_exclure) {
31                        $saisies = saisies_supprimer($saisies,$champ_a_exclure);
32                }
33        }
34
35        // On récupère les destinataires
36        if ($options['champ_destinataires']) {
37                $destinataires = _request($options['champ_destinataires']);
38                if (!is_array($destinataires)) {
39                        if (intval($destinataires)) {
40                                $destinataires = array($destinataires);
41                        } else {
42                                $destinataires = array();
43                        }
44                }
45                if (count($destinataires)) {
46                        // On récupère les mails des destinataires
47                        $destinataires = array_map('intval', $destinataires);
48                        $destinataires = sql_allfetsel(
49                                'email',
50                                'spip_auteurs',
51                                sql_in('id_auteur', $destinataires)
52                        );
53                        $destinataires = array_map('reset', $destinataires);
54                }
55        }
56
57        if ($options['champ_courriel_destinataire_form']) {
58                $courriel_champ_form = _request($options['champ_courriel_destinataire_form']);
59                $destinataires[] = $courriel_champ_form;
60        }
61
62
63        // On ajoute les destinataires en plus
64        if ($options['destinataires_plus']) {
65                $destinataires_plus = explode(',', $options['destinataires_plus']);
66                $destinataires_plus = array_map('trim', $destinataires_plus);
67                $destinataires = array_merge($destinataires, $destinataires_plus);
68                $destinataires = array_unique($destinataires);
69        }
70
71        // On ajoute les destinataires en fonction des choix de saisie dans le formulaire
72        // @selection_1@/choix1 : mail@domain.tld
73        // @selection_1@/choix2 : autre@domain.tld, lapin@domain.tld
74        if (!empty($options['destinataires_selon_champ'])) {
75                if ($destinataires_selon_champ = formidable_traiter_email_destinataire_selon_champ($options['destinataires_selon_champ'])) {
76                        $destinataires = array_merge($destinataires, $destinataires_selon_champ);
77                        $destinataires = array_unique($destinataires);
78                }
79        }
80
81        // On récupère le courriel de l'envoyeur s'il existe
82        if ($options['champ_courriel']) {
83                $courriel_envoyeur = _request($options['champ_courriel']);
84        }
85        if (!isset($courriel_envoyeur)) {
86                $courriel_envoyeur = '';
87        }
88
89        // Si on a bien des destinataires, on peut continuer
90        if ($destinataires or ($courriel_envoyeur and $options['activer_accuse'])) {
91                include_spip('inc/filtres');
92                include_spip('inc/texte');
93
94                $nom_site_spip = supprimer_tags(typo($GLOBALS['meta']['nom_site']));
95
96                // On parcourt les champs pour générer le tableau des valeurs
97                $valeurs = array();
98                $valeurs_libellees = array();
99                $saisies_fichiers = saisies_lister_avec_type($saisies, 'fichiers');
100                $saisies_par_nom = saisies_lister_par_nom($saisies);
101
102                // On utilise pas formulaires_formidable_fichiers,
103                // car celui-ci retourne les saisies fichiers du formulaire dans la base… or, on sait-jamais,
104                // il peut y avoir eu une modification entre le moment où l'utilisateur a vu le formulaire et maintenant
105                foreach ($champs as $champ) {
106                        if (array_key_exists($champ, $saisies_fichiers)) {// si on a affaire à une saisie de type fichiers, on traite à part
107                                $valeurs[$champ] = traiter_email_fichiers($saisies_fichiers[$champ], $champ, $formulaire['id_formulaire'], $retours, $timestamp);
108                                if ($ajouter_fichier) {
109                                        $retours['fichiers'][$champ] = $valeurs[$champ];
110                                }
111                                $taille_fichiers += formidable_calculer_taille_fichiers_saisie($valeurs[$champ]);
112                                $fichiers_facteur = array_merge(
113                                        $fichiers_facteur,
114                                        vue_fichier_to_tableau_facteur($valeurs[$champ])
115                                );
116                        } else {
117                                // On récupère la valeur postée
118                                $valeurs[$champ] = _request($champ);
119                               
120                                // Si la saisie est une liste de choix avec des clés et labels humains, on cherche le label humain, sauf si la case champ_sujet_valeurs_brutes est cochée dans la config du traitement
121                                if (
122                                        isset($saisies_par_nom[$champ]['options']['datas'])
123                                        and $labels_data = saisies_aplatir_tableau(saisies_chaine2tableau($saisies_par_nom[$champ]['options']['datas']))
124                                        and isset($labels_data[$valeurs[$champ]])
125                                        and !$options['champ_sujet_valeurs_brutes']
126                                ) {
127                                        $valeurs_libellees[$champ] = $labels_data[$valeurs[$champ]];
128                                }
129                                // Sinon on utilise directement la valeur postée
130                                else {
131                                        $valeurs_libellees[$champ] = $valeurs[$champ];
132                                }
133                        }
134                }
135                // On récupère le nom de l'envoyeur
136                if ($options['champ_nom']) {
137                        $a_remplacer = array();
138                        if (preg_match_all('/@[\w]+@/', $options['champ_nom'], $a_remplacer)) {
139                                $a_remplacer = $a_remplacer[0];
140                                foreach ($a_remplacer as $cle => $val) {
141                                        $a_remplacer[$cle] = trim($val, '@');
142                                }
143                                $a_remplacer = array_flip($a_remplacer);
144                                $a_remplacer = array_intersect_key($valeurs_libellees, $a_remplacer);
145                                $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
146                        }
147                        $nom_envoyeur = trim(_L($options['champ_nom'], $a_remplacer));
148                }
149                if (!isset($nom_envoyeur) or !$nom_envoyeur) {
150                        $nom_envoyeur = $nom_site_spip;
151                }
152
153                // On récupère le sujet s'il existe sinon on le construit
154                if ($options['champ_sujet']) {
155                        $a_remplacer = array();
156                        if (preg_match_all('/@[\w]+@/', $options['champ_sujet'], $a_remplacer)) {
157                                $a_remplacer = $a_remplacer[0];
158                                foreach ($a_remplacer as $cle => $val) {
159                                        $a_remplacer[$cle] = trim($val, '@');
160                                }
161                                $a_remplacer = array_flip($a_remplacer);
162                                $a_remplacer = array_intersect_key($valeurs_libellees, $a_remplacer);
163                                $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
164                        }
165                        $sujet = trim(_L($options['champ_sujet'], $a_remplacer));
166                }
167                if (!isset($sujet) or !$sujet) {
168                        $sujet = _T('formidable:traiter_email_sujet', array('nom'=>$nom_envoyeur));
169                }
170                $sujet = filtrer_entites($sujet);
171
172                // Mais quel va donc être le fond ?
173                if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_email.html')) {
174                        $notification = 'notifications/formulaire_'.$formulaire['identifiant'].'_email';
175                } else {
176                        $notification = 'notifications/formulaire_email';
177                }
178                // Est-ce qu'on est assez léger pour joindre les pj
179                $joindre_pj = false;
180                if ($taille_fichiers < 1024 * 1024 * _FORMIDABLE_TAILLE_MAX_FICHIERS_EMAIL
181                        and
182                        $traitements['email']['pj'] == 'on'
183                ) {
184                        $joindre_pj = true;
185                        foreach (array_keys($saisies_fichiers) as $nom) {
186                                $saisies = saisies_supprimer($saisies,$nom);   
187                        }
188                }
189                // On génère le mail avec le fond
190                $html = recuperer_fond(
191                        $notification,
192                        array(
193                                'id_formulaire' => $args['id_formulaire'],
194                                'id_formulaires_reponse' => isset($retours['id_formulaires_reponse']) ? $retours['id_formulaires_reponse'] : '',
195                                'titre' => _T_ou_typo($formulaire['titre']),
196                                'traitements' => $traitements,
197                                'saisies' => $saisies,
198                                'valeurs' => $valeurs,
199                                'masquer_liens' => $options['masquer_liens'],
200                                'ip' => $options['activer_ip']?$GLOBALS['ip']:''
201                        )
202                );
203
204                // On génère le texte brut
205                include_spip('facteur_fonctions');
206                $texte = facteur_mail_html2text($html);
207
208                // On utilise la forme avancée de Facteur
209                $corps = array(
210                        'html' => $html,
211                        'texte' => $texte,
212                        'nom_envoyeur' => filtrer_entites($nom_envoyeur),
213                );
214                // Joindre les pj si léger
215                if ($joindre_pj) {
216                        $corps['pieces_jointes'] = $fichiers_facteur;
217                }
218       
219                // Si l'utilisateur n'a pas indiqué autrement, on met le courriel de l'envoyeur dans
220                // Reply-To et on laisse le from par defaut de Facteur car sinon ca bloque sur les
221                // SMTP un peu restrictifs.
222                $courriel_from = '';
223                if ($courriel_envoyeur && $options['activer_vrai_envoyeur']) {
224                        $courriel_from = $courriel_envoyeur;
225                } elseif ($courriel_envoyeur) {
226                        $corps['repondre_a'] = $courriel_envoyeur;
227                }
228
229                // On envoie enfin le message
230                $envoyer_mail = charger_fonction('envoyer_mail', 'inc');
231
232                // On envoie aux destinataires
233                if ($destinataires) {
234                        $ok = $envoyer_mail($destinataires, $sujet, $corps, $courriel_from, 'X-Originating-IP: '.$GLOBALS['ip']);
235                }
236
237                // Si c'est bon, on envoie l'accusé de réception
238                if ($ok and $courriel_envoyeur and $options['activer_accuse']) {
239                        // On récupère le sujet s'il existe sinon on le construit
240                        if ($options['sujet_accuse']) {
241                                $a_remplacer = array();
242                                if (preg_match_all('/@[\w]+@/', $options['sujet_accuse'], $a_remplacer)) {
243                                        $a_remplacer = $a_remplacer[0];
244                                        foreach ($a_remplacer as $cle => $val) {
245                                                $a_remplacer[$cle] = trim($val, '@');
246                                        }
247                                        $a_remplacer = array_flip($a_remplacer);
248                                        $a_remplacer = array_intersect_key($valeurs_libellees, $a_remplacer);
249                                        $a_remplacer = array_merge($a_remplacer, array('nom_site_spip' => $nom_site_spip));
250                                }
251                                $sujet_accuse = trim(_L($options['sujet_accuse'], $a_remplacer));
252                        }
253                        if (!isset($sujet_accuse) or !$sujet_accuse) {
254                                $sujet_accuse = _T('formidable:traiter_email_sujet_accuse');
255                        }
256                        $sujet_accuse = filtrer_entites($sujet_accuse);
257
258                        // Mais quel va donc être le fond ?
259                        if (find_in_path('notifications/formulaire_'.$formulaire['identifiant'].'_accuse.html')) {
260                                $accuse = 'notifications/formulaire_'.$formulaire['identifiant'].'_accuse';
261                        } else {
262                                $accuse = 'notifications/formulaire_accuse';
263                        }
264
265                        // On génère l'accusé de réception
266                        if (_FORMIDABLE_LIENS_FICHIERS_ACCUSE_RECEPTION == false) {
267                                $valeurs = vues_saisies_supprimer_action_recuperer_fichier_par_email($saisies, $valeurs);
268                        }
269                        $html_accuse = recuperer_fond(
270                                $accuse,
271                                array(
272                                        'id_formulaire' => $formulaire['id_formulaire'],
273                                        'titre' => _T_ou_typo($formulaire['titre']),
274                                        'message_retour' => $formulaire['message_retour'],
275                                        'traitements' => $traitements,
276                                        'saisies' => $saisies,
277                                        'valeurs' => $valeurs
278                                )
279                        );
280
281                        // On génère le texte brut
282                        $texte = facteur_mail_html2text($html_accuse);
283
284                        // Si un nom d'expéditeur est précisé pour l'AR, on l'utilise,
285                        // sinon on utilise le nomde l'envoyeur du courriel principal
286                        $nom_envoyeur_accuse = trim($options['nom_envoyeur_accuse']);
287                        if (!$nom_envoyeur_accuse) {
288                                $nom_envoyeur_accuse = $nom_envoyeur;
289                        }
290
291                        $corps = array(
292                                'html' => $html_accuse,
293                                'texte' => $texte,
294                                'nom_envoyeur' => filtrer_entites($nom_envoyeur_accuse),
295                        );
296                       
297                        //A fortiori, si un courriel d'expéditeur est précisé pour l'AR, on l'utilise
298                        if ($options['courriel_envoyeur_accuse']) {
299                                $courriel_envoyeur_accuse = $options['courriel_envoyeur_accuse'];
300                        } else {
301                                $courriel_envoyeur_accuse = $courriel_envoyeur;
302                        }
303
304                        //Et on teste si on doit mettre cela en from ou en reply-to
305                        if ($options['activer_vrai_envoyeur'] and $courriel_envoyeur_accuse) {
306                                $courriel_from_accuse = $courriel_envoyeur_accuse;
307                        } elseif ($courriel_envoyeur_accuse) {
308                                $corps['repondre_a'] = $courriel_envoyeur_accuse;
309                                $courriel_from_accuse = '';
310                        }
311                       
312                        // Joindre les pj si léger et nécessaire
313                        if ($joindre_pj and  _FORMIDABLE_LIENS_FICHIERS_ACCUSE_RECEPTION == false) {
314                                $corps['pieces_jointes'] = $fichiers_facteur;
315                        }
316
317                        $ok = $envoyer_mail($courriel_envoyeur, $sujet_accuse, $corps, $courriel_from_accuse, 'X-Originating-IP: '.$GLOBALS['ip']);
318                }
319
320                if ($ok) {
321                        if (isset($retours['message_ok'])) {
322                                $retours['message_ok'] .= "\n"._T('formidable:traiter_email_message_ok');
323                        } else {
324                                $retours['message_ok'] = _T('formidable:traiter_email_message_ok');
325                        }
326                } else {
327                        if (isset($retours['message_erreur'])) {
328                                $retours['message_erreur'] .= "\n"._T('formidable:traiter_email_message_erreur');
329                        } else {
330                                $retours['message_erreur'] = _T('formidable:traiter_email_message_erreur');
331                        }
332                }
333        }
334
335        // noter qu'on a deja fait le boulot, pour ne pas risquer double appel
336        $retours['traitements']['email'] = true;
337        return $retours;
338}
339
340
341/**
342 * Retourne la liste des destinataires sélectionnés en fonction
343 * de l'option 'destinataires_selon_champ' du traitement email.
344 *
345 * @param string $description
346 *     Description saisie dans l'option du traitement du formulaire,
347 *     qui respecte le schéma prévu, c'est à dire : 1 description par ligne,
348 *     tel que `@champ@/valeur : mail@domain.tld, mail@domain.tld, ...`
349 *     {@example : `@selection_2@/choix_1 : toto@domain.tld`}
350 * @return array
351 *     Liste des destinataires, s'il y en a.
352 **/
353function formidable_traiter_email_destinataire_selon_champ($description) {
354        $destinataires = array();
355
356        // 1 test à rechercher par ligne
357        $descriptions = explode("\n", trim($description));
358        $descriptions = array_map('trim', $descriptions);
359        $descriptions = array_filter($descriptions);
360
361        // pour chaque test, s'il est valide, ajouter les courriels indiqués
362        foreach ($descriptions as $test) {
363                // Un # est un commentaire
364                if ($test[0] == '#') {
365                        continue;
366                }
367                // Le premier caractère est toujours un @
368                if ($test[0] != '@') {
369                        continue;
370                }
371
372
373                list($champ, $reste) = explode('/', $test, 2);
374                $champ = substr(trim($champ), 1, -1); // enlever les @
375
376                if ($reste) {
377                        list($valeur, $mails) = explode(':', $reste, 2);
378                        $valeur = trim($valeur);
379                        $mails = explode(',', $mails);
380                        $mails = array_map('trim', $mails);
381                        $mails = array_filter($mails);
382                        if ($mails) {
383                                // obtenir la valeur du champ saisi dans le formulaire.
384                                // cela peut être un tableau.
385                                $champ = _request($champ);
386                                if (!is_null($champ)) {
387                                        $ok = is_array($champ) ? in_array($valeur, $champ) : ($champ == $valeur);
388
389                                        if ($ok) {
390                                                $destinataires = array_merge($destinataires, $mails);
391                                                $destinataires = array_unique($destinataires);
392                                        }
393                                }
394                        }
395                }
396        }
397
398        return $destinataires;
399}
400
401/**
402 * Gère une saisie de type fichiers dans le traitement par email.
403 * C'est à dire:
404 *      - S'il y a eu un enregistement avant, ne déplace pas le fichier
405 *      - S'il n'y a pas eu d'enregistrement avant, déplace le fichier
406 *              dans un dossier nommé en fonction du timestamp du traitement
407 *      - Renvoie un tableau décrivant les fichiers, avec une url d'action sécurisée valable seulement
408 *              _FORMIDABLE_EXPIRATION_FICHIERS_EMAIL (sauf si cette constantes est définie à 0)
409 * @param array $saisie la description de la saisie
410 * @param string $nom le nom de la saisie
411 * @param int|string $id_formulaire le formulaire concerné
412 * @param array $retours ce qu'a envoyé le précédent traitement
413 * @param int $timestamp un timestamp correspondant au début du processus de création du courriel
414 * @return array un tableau décrivant la saisie
415 **/
416function traiter_email_fichiers($saisie, $nom, $id_formulaire, $retours, $timestamp) {
417        //Initialisation
418        $id_formulaire = strval($id_formulaire);//précaution
419        $vue = array();
420
421        if (isset($retours['id_formulaires_reponse']) and $id_formulaires_reponse = $retours['id_formulaires_reponse']) { // cas simple: les réponses ont été enregistrées
422                if (isset($retours['fichiers'][$nom])) { // petite précaution
423                        $options = array(
424                                'id_formulaire' => $id_formulaire,
425                                'id_formulaires_reponse' => $retours['id_formulaires_reponse']
426                        );
427                        $vue = ajouter_action_recuperer_fichier_par_email($retours['fichiers'][$nom], $nom, $options);
428                }
429        } else { // si les réponses n'ont pas été enregistrées
430                $vue = formidable_deplacer_fichiers_produire_vue_saisie($saisie, array('id_formulaire' => $id_formulaire, 'timestamp' => $timestamp));
431                        $options = array(
432                                'id_formulaire' => $id_formulaire,
433                                'timestamp' => $timestamp
434                        );
435                        $vue = ajouter_action_recuperer_fichier_par_email($vue, $nom, $options);
436        }
437
438        return $vue;
439}
440
441
442/**
443 * Pour une saisie de type 'fichiers'
444 * insère dans la description du résultat de cette saisie
445 * l'url de l'action pour récuperer la saisie par email
446 * Ajoute également une vignette correspondant à l'extension
447 * @param array $saisie_a_modifier
448 * @param string $nom_saisie
449 * @param array $options options qui décrit l'endroit où est stocké le fichier
450 * @return array $saisie_a_modifier
451 **/
452function ajouter_action_recuperer_fichier_par_email($saisie_a_modifier, $nom_saisie, $options) {
453        $vignette_par_defaut = charger_fonction('vignette', 'inc/');
454
455        if (_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL > 0) {
456                $delai = secondes_en_jour(_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL);
457        }
458        foreach ($saisie_a_modifier as $i => $valeur) {
459                $url = formidable_generer_url_action_recuperer_fichier_email($nom_saisie, $valeur['nom'], $options);
460                $saisie_a_modifier[$i]['url'] = $url;
461                if (_FORMIDABLE_EXPIRATION_FICHIERS_EMAIL > 0) {
462                        $saisie_a_modifier[$i]['fichier'] = $valeur['nom'];
463                        $saisie_a_modifier[$i]['nom'] = '['._T('formidable:lien_expire', array('delai' => $delai)).'] '.$valeur['nom'];
464                } else {
465                        $saisie_a_modifier[$i]['fichier'] = $valeur['nom'];
466                        $saisie_a_modifier[$i]['nom'] = $valeur['nom'];
467                }
468                if (isset($valeur['extension'])) {
469                        $saisie_a_modifier[$i]['vignette'] = $vignette_par_defaut($valeur['extension'], false);
470                }
471        }
472        return $saisie_a_modifier;
473}
474/**
475 * Supprime dans une vue de saisie 'fichiers'
476 * l'url de récupération par email
477 * et l'information sur le délai d'expiration
478 * @param array $vue
479 * @return array $vue
480**/
481function supprimer_action_recuperer_fichier_par_email($vue) {
482        foreach ($vue as $f => &$desc) {
483                if (isset($desc['url'])) {
484                        unset($desc['url']);
485                }
486                $desc['nom'] = $desc['fichier'];
487        }
488        return $vue;
489}
490
491/**
492 * Dans l'ensemble de vues des saisies
493 * recherche les saisies 'fichiers'
494 * et supprime pour chacune d'entre elle les actions de récupération de fichier
495 * @param array $saisies
496 * @param array $vues
497 * @return array $vues
498**/
499function vues_saisies_supprimer_action_recuperer_fichier_par_email($saisies, $vues) {
500        foreach ($saisies as $saisie => $description) {
501                if ($description['saisie'] == 'fichiers') { // si de type fichiers
502                        $nom_saisie = $description['options']['nom'];
503                        $vues[$nom_saisie] = supprimer_action_recuperer_fichier_par_email($vues[$nom_saisie]);
504                }
505        }
506        return $vues;
507}
508
509/**
510 * Calcule la taille totale des fichiers
511 * d'après une saisie de type fichiers
512 * @param array $saisie
513 * @return int $taille (en octets)
514**/
515function formidable_calculer_taille_fichiers_saisie($saisie) {
516        $taille = 0;
517        foreach ($saisie as $k => $info) {
518                $taille += $info['taille'];
519        }
520        return $taille;
521}
522
523/**
524 * Converti une description d'une vue fichiers en description passable à facteur
525 * @param array $vue
526 * @return array $tableau_facteur
527**/
528function vue_fichier_to_tableau_facteur($vue) {
529        $tableau_facteur = array();
530        foreach ($vue as $fichier) {
531                $arg = unserialize(parametre_url($fichier['url'],'arg'));
532                $tableau_facteur[] = array(
533                        'chemin' => formidable_generer_chemin_fichier($arg),
534                        'nom' => $fichier['fichier'],
535                        'encodage' => 'base64',
536                        'mime' => $fichier['mime']);
537        }
538        return $tableau_facteur;
539}
540
541/**
542 * Retourne des secondes sous une jolie forme, du type xx jours, yy heures, zz minutes, aa secondes
543 * @param int $seconde
544 * @return str
545**/
546function secondes_en_jour($secondes) {
547        //On ne peut pas utiliser date_create, car en PHP 5.2, et SPIP 3.0 est à partir de PHP 5.1…
548        $jours = floor($secondes/(24*3600));
549        $heures = floor(($secondes-$jours*24*3600)/3600);
550        $minutes = floor(($secondes-$jours*24*3600-$heures*3600)/60);
551        $secondes = $secondes-$jours*24*3600-$heures*3600-$minutes*60;
552        $param = array(
553                'j' => $jours,
554                'h' => $heures,
555                'm' => $minutes,
556                's' => $secondes
557        );
558        if ($jours > 0) {
559                return _T('formidable:jours_heures_minutes_secondes', $param);
560        } elseif ($heures > 0) {
561                return _T('formidable:heures_minutes_secondes', $param);
562        } elseif ($minutes > 0) {
563                return _T('formidable:minutes_secondes', $param);
564        } else {
565                return _T('formidable:secondes', $param);
566        }
567}
Note: See TracBrowser for help on using the repository browser.