Compare commits

...
Sign in to create a new pull request.

132 commits

Author SHA1 Message Date
cy_altern
8415578c22 Feat : ajout des slugs + @@ nécessaires si on veut utiliser Gamumail pour les inscriptions d'auteurs ou le rappel de mot de passe + la doc pour ces 2 ajouts optionnels dans le README 2025-02-27 20:05:17 +01:00
f654cbcc62 feat: test_slug peut utiliser id_dossier dans l'env 2025-02-13 18:56:56 +01:00
f835af735d chore: up de z 2025-02-13 14:08:10 +01:00
66ecc85ecb fix: on vérifie que le slug n'existe pas,
cela arrive si la creation du slug est déplacer dans un autre plugin
comme gformation
2025-02-13 14:07:53 +01:00
cy_altern
e60bb95f70 Feat : les remplacements et leur doc pour @@date_maintenant@@ et @@date_heure_maintenant@@ 2025-01-04 01:02:22 +01:00
cy_altern
1f134ebe36 Feat : ajout de @@date_maintenant@@ et @@date_heure_maintenant@@ dans les remplacements fournis de base par Gamumail 2025-01-04 00:51:43 +01:00
c8519cfabe cci gamuza que dans le traite 2025-01-02 14:32:42 +01:00
ee44ab4bed doc 2025-01-02 14:12:18 +01:00
27d04e9eee up de z 2025-01-02 14:10:17 +01:00
b9d687bad4 feat: ajout une globals : $GLOBALS['gamuza_mail_cci'] qui est un array 2025-01-02 14:09:57 +01:00
cy_altern
3caca6a1fc Fix : ne pas passer en 3ème paramètre de l'appel de generer_pdf() : le type n'est pas du tout adapté (array à la place de string|bool) 2024-12-05 21:06:17 +01:00
cy_altern
f5c6c696a2 Feat : passage de la récupération des PDFs à envoyer à la fonction dédiée de Gamufonctions 2024-12-05 18:13:53 +01:00
cy_altern
9797f06364 Fix : générer tous les PDFs dynamiques (et pas uniquement le premier) 2024-12-05 16:51:21 +01:00
4eede987fa coquille 2024-12-05 16:31:24 +01:00
d4405aa751 test pour cyrille 2024-12-05 16:31:00 +01:00
f2d5d05347 feat: charger_pdf utiliser maintenant la fonction de gamufonctions generer_pdf 2024-12-05 12:41:51 +01:00
ff9c550c22 up de z 2024-11-04 16:38:30 +01:00
569de1e0d7 fix: il faut faire passer alea 2024-11-04 16:38:17 +01:00
cy_altern
39e66784ee Chore : précision dans le phpdoc de la fonction pour les PDFs générés 2024-10-14 13:40:50 +02:00
cy_altern
4ee007026d Fix : {tous} dans la boucle de sélection des documents attachés à un slug pour ne pas être dépendant du fait qu'ils soient publiés ou non 2024-10-10 02:23:41 +02:00
bdd0a8783e revert 2024-09-19 22:47:51 +02:00
c6d00822d9 PSR 2024-09-19 22:45:08 +02:00
484e5c833f fix: tentative de fix que $texte n'existe pas 2024-09-19 22:44:58 +02:00
9ee0dc7e99 fix: si on appelle gamumail_remplacer_modele avec le deuxieme argument vide, on le remplace par un espace afin de supprimer le modele 2024-09-19 22:44:30 +02:00
cy_altern
b1d7e8adaa Chore : ajout du remplacement @@nom_site@@ + complement doc des nouveaux @@ pour le footer de la pagede config + chaînes de langue 2024-07-19 12:28:14 +02:00
88ff6b90d9 fix: on teste la présence de @@url_spip_pass@@ sinon, erreur de jeton 2024-07-19 10:12:50 +02:00
e360a189ee feat: ajout slug : url_spip_pass 2024-07-19 09:31:28 +02:00
8a7a4c1a58 feat: on peut utiliser inc/envoyer_gamumail sans slug
Pour cela, il faut :
* utiliser le slug : `no_slug`
* ajouter dans $options['message']
* facultatif $options['sujet']
2024-07-18 11:49:49 +02:00
c7c4ebc2e4 compat spip 4.* 2024-07-16 14:17:14 +02:00
fed21d5d28 fix: warning 2024-07-02 16:09:51 +02:00
cy_altern
69d0d3f9c5 up de z 2024-06-07 16:52:25 +02:00
cy_altern
d57df2412e Feat : les remplacements de Gamumail (y compris ceux arrivant depuis le pipeline remplacements_slug) doivent passer par extraire_multi() pour gérer les éventuelles chaînes de langue injectées 2024-06-07 16:51:30 +02:00
cy_altern
13021a3df1 Chore : petite amélioration de la présentation de la page de configuration de gamumail 2024-05-07 23:07:05 +02:00
9672c3ee46 feat: ajout la possibilite de modifier le prefix du slug 2024-04-05 12:00:16 +02:00
260dffa24e debug 2024-01-08 12:06:45 +01:00
cy_altern
9b45a62720 up de z 2023-12-01 13:19:24 +01:00
cy_altern
3fb6c98e6e Fix: mettre tout lemonde d'accord pour les destinataires en copie cachée : Facteur utilise [bcc] mais Gamumail lui passe [cci]... 2023-12-01 13:18:45 +01:00
cy_altern
00b859cb02 Fix: compat PHP 8.2 : explode ne supporte plus NULL en 2ème paramètre (string) 2023-12-01 12:45:27 +01:00
0431d0e6f4 fix: nom de fichier envoyé via bigup
cv : https://git.spip.net/spip-contrib-extensions/facteur/issues/28
refs crfck/suivi_gformation#172
2023-11-23 00:42:46 +01:00
91b3879924 fix: bigup et le prechargement de fichier, à l'ouverture du form, on vide bigup à la mano 2023-11-21 14:22:22 +01:00
5785e07b91 up de y 2023-11-17 15:09:45 +01:00
dff72a5aa6 Attention, ne pas charger cette valeurs dans le form, pour éviter de
charger un fichier qui n'aurait pas été envoyé donc nettoyé
2023-11-17 15:09:45 +01:00
cy_altern
c557173154 Fix : il ne faut PAS monter le necessite de bigform à plus que 1.2.3 sous peine de ne plus pouvoir utiliser Gamumail en SPIP 4.0/4.1 2023-11-14 14:00:31 +01:00
cy_altern
258902d900 Feat: gérer les évenutels multi qui résultent des remplacements juste avant l'envoi (non fonctionnel pour envoyer_gamumail : cf TO DO) 2023-11-14 12:07:26 +01:00
8882667666 on rend un peu plus responsive 2023-11-13 18:44:50 +01:00
a7fe6a811f feat:
- la fonction charger_pdf() accepte maintenant un 3e args, les opts
- on ajoute dans l'array des pieces jointes des infos (qui (d'où vient
  se pièce jointe) et quoi (son id))
- on deplace l'affichage des tPDFS dans un inclure :
  gamumail/inc-pdf_envoyes.html qui permet d'etre facilement surchargé
2023-11-13 14:09:17 +01:00
4e61ca9ec1 chore: ergo 2023-11-09 15:26:45 +01:00
64bfe8bc78 feat: ajout pipeline pour filtrer le tableau de pdf 2023-11-09 15:21:53 +01:00
999663fa9f chore: up de z 2023-11-09 14:29:30 +01:00
57e1466497 feat: ajout la possibilité de joindre des fichiers téléverser.
Attention, ces fichiers ne sont pas sauvegardés.
Fichiers acceptés :
    * images
    * pdf
2023-11-09 14:27:43 +01:00
1f870feae8 fix: code mort 2023-11-09 11:13:21 +01:00
5efa4f4fb5 chore: up de z 2023-11-09 10:18:20 +01:00
0c63b86241 fix: si le slug est vide, on ne precharge pas le contenu, car normalement c'est impossible
cela corrige le bug, si on a une entrée dans spip_gamumails sans slug !
2023-11-09 10:17:55 +01:00
434e7a0cf8 chore: up de y pour envoi_separe 2023-11-07 10:43:45 +01:00
08e1fac607 fix: radio envoi separe 2023-11-07 10:40:27 +01:00
c70ced219c Merge branch 'envoi_separe' 2023-11-07 10:34:28 +01:00
9c1ad3591d feat: on passe par remplacements slug sur le nom du fichier pdf 2023-11-07 10:34:00 +01:00
ab2476fdcf fix: il ne faut pas merger les options dans le contexte 2023-11-07 09:56:36 +01:00
d40c764aa4 fix: envoie separe avec le contexte, ajout un pipeline pour les cas compliqués 2023-11-06 18:42:36 +01:00
cy_altern
edccc08f83 Feat: ajout fichier de langue EN 2023-11-06 16:45:36 +01:00
cy_altern
cb1db1aa91 merge 2023-11-06 16:44:54 +01:00
cy_altern
6f73910ed4 Feat: multilangue gestion de la langue dans le contexte des PDFs générés 2023-11-06 16:37:48 +01:00
cy_altern
15d9526132 Feat: gestion basique du multilinguisme :
- les sujets et textes des slugs peuvent désormais être multilangue en utilisant des <multi>
- la langue utilisée pour le mail est celle passée dans options[lang] de l'appel de FORMULAIRE_GAMUMAIL
TODO : voir comment on pourrait faire pour gérer la langue du mail non pas pour l'ensemble des destinataires mais pour chacun d'eux....
2023-11-06 00:45:59 +01:00
cy_altern
dddde4449f Feat : page de configuration des slugs : ajout d'un lien direct sur l'édition des documents (PDF) attachés au slug 2023-10-18 23:40:55 +02:00
cy_altern
c4865b4ee2 Feat: ajout de la classe nomulti aux champs qui ne doivent pas intégrer le multilang lors de l'édition 2023-10-18 23:22:08 +02:00
cy_altern
df8f8051af Feat: passage en 4.2 2023-08-19 18:18:38 +02:00
6aaba3f5fe recup de la master 2023-06-13 15:33:26 +02:00
9a59e7a8b1 feat: ajout de repondre_a 2023-06-05 20:43:09 +02:00
ecdc5d1134 feat: on n'utilise plus la lib pour le copié, on le fait via l'api js
plus simplement. on ajoute aussi le copié dans le textarea, comme le
fait le privé pour les modeles
2023-04-23 11:40:27 +02:00
9678584fc3 avec les fichiers c'est mieux 2023-04-22 17:50:43 +02:00
bbe0bf3ac0 feat: si on clique sur une balise, elle est copiée dans le presse papier 2023-04-22 17:42:18 +02:00
ecf2571f06 up de y, car on casse la compat sur le remplacement automatique de @@nom@@ et @@prenom@@ 2023-04-22 17:01:41 +02:00
752a00ff4c feat:
* le remplacement de @@nom@@ renvoi que la valeur du champ nom ou un
espace pour supprimer @@nom@@
* le remplacement de @@prenom@@ renvoi que la valeur du champ prenom ou un
espace pour supprimer @@prenom@@
2023-04-22 16:59:53 +02:00
f1315dd545 feat: rend compatible spip_gamumails avec api objet_modifier 2023-04-18 14:28:03 +02:00
88d4d9a32e refactoring: utilise generer_url_public pour l'url du pdf 2023-04-06 14:45:16 +02:00
17edcf7841 feat: compat spip 41 creation auteur 2023-04-06 14:16:04 +02:00
ef9ab75784 feat: on supprime le h2 fichier annexe, car pas de pb de compat 2023-04-04 23:25:26 +02:00
6c8ec91c95 feat: ajout all_fichiers en plus de #SLUG_fichiers 2023-04-04 23:24:35 +02:00
9c743d0e73 feat: appelle fonction traiter_pieces_jointes, en arg 1 = le slug 2023-04-04 23:19:32 +02:00
42ed572d43 feat: ajout info corps + sujet dans le pipeline final 2023-04-04 22:59:53 +02:00
143faff6c4 feat: ajout fichier traiter_pieces_jointes pour ajouter des pieces jointes avant l'envoi, utilie si on utilise envoi_separe 2023-03-31 08:08:56 +02:00
35584c2a49 feat: on peut passer dans le param options : envoi_separe => oui,
cela ajoute un radio (coché oui par defaut) pour jouer l'envoi pour
chaque destinataire du pour et non pas 1 seul message pour tous les
destinataires
2023-03-30 22:44:37 +02:00
014748da64 fix: warning 2023-03-30 17:45:27 +02:00
8cd9a772c3 psr 2023-03-30 17:13:59 +02:00
e3565cb307 fix: on veut pouvoir charger les options, comment ca peut fonctionner chez ROC ? 2023-03-30 11:39:36 +02:00
7dd8e9dbf3 fix: coquillle 2023-03-30 11:29:40 +02:00
3a69e1215f TEST id du toggle n'est pas uniquemnet le slug, car on veut pouvoir avoir 2 modeles avec le meme slug 2023-03-30 10:19:52 +02:00
4834981703 compat php 8.1 2023-03-23 13:51:33 +01:00
cy_altern
71f052248f rupture de compatibilité = up de Y 2022-12-05 23:19:41 +01:00
cy_altern
9148afd5f7 comme d'hab ne pas oublier de var_dump de débog... 2022-12-05 17:57:06 +01:00
cy_altern
37a617611a renommage des fonctions de surcharge du CVT de Gamumail utilisée par tous les slugs en gamumail_tous_charger, gamumail_tous_verifier et gamumail_tous_traiter : ça évitera les ambiguités à l'appel de ces fonctions par charger_fonction() (parfois c'était gamumail_charger_dist qui était envoyée à la place de gamumail_charger du plugin de surcharge...)
ATTENTION ! rupture de compatibilité possible pour les surcharges existantes ! (à priori aucun plugin concerné en dehors de rocb)
2022-12-05 17:52:55 +01:00
cy_altern
92e746c637 éviter un warning sur l'appel de la chaîne de langue lors de l'envoi d'un mail à la création d'un auteur (à voir si le passage de _T à _L règle vraiment le problème...) 2022-06-05 19:08:06 +02:00
cy_altern
31fb4839fe ne pas planter si pas de slug ou slug absent de la BdD 2022-05-27 19:24:13 +02:00
cy_altern
e5a74ca03a correction du bogue d'envoi en cci : le paramètre à passer à facteur est ['bcc'] et non pas ['cci']. Ajout d'une option pour pouvoir passer le destinataire principal lorsqu'on utilise ['cci'] pour masquer les destinataires 2022-05-12 16:50:55 +02:00
cy_altern
b7447eb50c ajout du pseudo-slug no_gamumail qui permet de bloquer automatiquement tout envoi de mail passé à Gamumail avec cet identifiant de slug 2022-03-31 12:28:12 +02:00
cy_altern
6cdab4719c un var_dump qui trainait 2022-03-21 11:12:21 +01:00
2ed1f93378 ajout cle previsu pour eviter warning php 8 2022-03-21 11:08:57 +01:00
cy_altern
5301cecf49 anticiper le passage en SPIP 4.1 2022-02-21 16:54:48 +01:00
cy_altern
d14d1e37e0 pas de titre h1 dans l'inclure pour être plus souple dans les intégrations de la page de config 2022-01-07 11:05:15 +01:00
cy_altern
5a3f4d4766 ajout de la fonction pour débogage des Curl 2021-11-09 13:04:53 +01:00
cy_altern
efa71bd7af afficher tous les docs liés à un modèle de mail même les non publiés 2021-10-30 11:34:37 +02:00
cy_altern
eda3619e7e ajout d'un paramètre supplémentaire au tableau Tclient qu'on passe au charger de gamumail pour permette de mettre les clients en cc ou cci plutôt qu'en destinataire principal du mail 2021-09-30 22:11:28 +02:00
0b9ab15453 coquille 2021-09-20 22:03:13 +02:00
7351f46320 maj de la doc, mais surveiller l'argument : args 2021-09-20 21:09:04 +02:00
ce248f1092 up de z 2021-09-20 18:11:53 +02:00
64ac966c62 ajout un env pour cacher le selecteur de slug : cacher_selecteur_slug 2021-09-20 18:11:41 +02:00
0ade34cf32 on est plus selectif sur les class css 2021-09-20 15:12:34 +02:00
a6128894f1 maj doc 2021-09-20 14:47:58 +02:00
cy_altern
101f530f10 un titre pour la page de configuration des slugs de gamumails 2021-09-14 22:39:25 +02:00
24eec4e076 correction de la doc 2021-09-14 15:20:57 +02:00
cy_altern
01db7f0715 up de z pour s'y retrouver 2021-08-16 16:49:05 +02:00
cy_altern
2b7654c330 ajout du champ rang 2021-08-16 16:35:54 +02:00
cy_altern
a07ba38516 affichage des gamumails par rangs dans l'interface de config 2021-08-01 21:06:36 +02:00
cy_altern
3223f7d469 la doc pour utiliser l'astuce de l'inclure pour le JS conditionné par le retour du traiter de gamumail 2021-07-30 21:49:10 +02:00
cy_altern
ba1df28aab doc pour le pipeline post_gamumail_ok 2021-07-30 21:20:37 +02:00
cy_altern
b0367c2ef2 si l'envoi du gamumail est OK, on suffixe message_ok par @@gamumail_ok ce qui permet de faire un test sur le retour de traiter qui soit indépendant de la langue de la chaîne de langue retournée par message_ok pour l'astuce du INCLURE qui ferme la modalbox 2021-07-30 21:08:43 +02:00
cy_altern
da0abaaad0 ajout de l'inclure vide à surcharger pour gérer le retour de l'envoi d'un gamumail (fermeture modale par ex). Ajout du pipeline post_gamumail_ok qui permet de faire une action lorsque le gamumail est envoyé OK 2021-07-30 17:57:48 +02:00
1bea462a2e variable dans le sujet 2021-06-30 21:48:54 +02:00
8be8f65146 il faut forcer fichier 2021-06-23 13:35:57 +02:00
59f54ac3f8 ajout 4 args = array id_doc à ajouter en piece jointe 2021-06-23 13:02:26 +02:00
fb640a92bc gere le cas des documents protected 2021-06-23 12:36:24 +02:00
9e3e8e59ad up de z 2021-06-23 10:14:28 +02:00
b6ed024365 permettre a gamumail d'etre utilisé sans slug, pratique pour utiliser simplement l'interface 2021-06-23 10:14:09 +02:00
d7c0ca8ff7 indentation 2021-06-23 10:03:21 +02:00
b0a3a1a0fd le sujet aussi à le droits aux variables 2021-06-22 16:02:16 +02:00
a6f1fa33c5 Merge branch 'master' of https://git.gamuza.fr/spip/gamumail 2021-06-08 21:54:46 +02:00
45502ac50c un peu de ménage 2021-06-08 21:54:26 +02:00
cy_altern
34ed1903de amélioration organisation de la page de config 2021-06-03 19:22:32 +02:00
cy_altern
0c362f4f43 afficher les détails des fichiers id_docs attachés à un slug dans l'interface de gestion des slugs 2021-06-01 03:12:50 +02:00
cy_altern
dbf1f5388f mise au carré des remplacements @@ des slugs 2021-06-01 02:42:31 +02:00
cy_altern
a2ec61032f l'inclure d'ajout des fichiers d'un slug gamumail/NOM_SLUG_fichiers.html doit se faire en passant l'array d'options du slug à l'inclure pour qu'il puisse bénéficier du contexte 2021-05-31 23:13:15 +02:00
cy_altern
d864fb3562 KISS pour le form d'envoi du mail de préinscription : on passe les docs d'assurance en id_doc attachés. 2021-05-31 20:14:49 +02:00
26 changed files with 1287 additions and 426 deletions

263
README.md
View file

@ -1,30 +1,41 @@
# gamuMail
> formulaire d'envoi de messages configurables
## Il gere nativement :
* Pour
* Cc en meta : **gamumail/mail_cc**
* Cci en en meta : **gamumail/mail_cci**
* Sujet
* Texte
* Les documents attachés au modèle (cf ci-dessous)
* une liste de pdf (il faut le plugin spipdf)
- Pour
- Cc en meta : **gamumail/mail_cc**
- Cci en en meta : **gamumail/mail_cci**
- Cci en globals []: `$GLOBALS['gamuza_mail_cci'] = ['sarl.gamuza@gmail.com'];`
- Sujet
- Texte
- Les documents attachés au modèle (cf ci-dessous)
- une liste de pdf (il faut le plugin spipdf)
![interface](doc/interface.png "interface")
## Il gere des modèles de contenu pour :
* Sujet
* Texte
* ID documents joints (spip_documents)
- Sujet
- Texte
- ID documents joints (spip_documents)
---
* Chaque modèle à un identifiant textuel : **slug** qui doit etre unique. Il ne peut etre créé / modifié QUE par les webmestres
* Pour gerer ses modèles, il faut se rendre sur la page : `?page=configurer_mails`
- Chaque modèle à un identifiant textuel : **slug** qui doit etre unique. Il ne peut etre créé / modifié QUE par les webmestres
- Pour gerer ses modèles, il faut se rendre sur la page : `?page=configuration_mails`
![configuration](doc/configuration.png "Exemple de configuration")
## Personnalisation du formulaire d'envoi
### Dans le html
On peut ajouter des documents via un fichier du type : **gamumail/SLUG_fichier.html** SLUG doit etre remplacé par le nom du slug du modèle
> **/!\ Le name doit etre Tid_doc**
>
ex de fichier :
> ex de fichier :
```html
<B_doc>
<h2>Fichiers attachés au séjour</h2>
@ -33,31 +44,38 @@ ex de fichier :
<BOUCLE_doc(DOCUMENTS){id_article=#ENV{options/id_article}}{extension=pdf}>
<div class="choix">
<input type="checkbox" class="checkbox" name="Tid_doc[]" value="#ID_DOCUMENT" id="Tid_doc_#ID_DOCUMENT" checked="checked" >
<label for="Tid_doc_#ID_DOCUMENT"><i class="fa fa-file-pdf-o rouge"></i>[ (#TITRE|sinon{#FICHIER|basename})]</label>
<label for="Tid_doc_#ID_DOCUMENT">
<i class="fa fa-file-pdf-o rouge"></i>[ (#TITRE|sinon{#FICHIER|basename})] :
<a class="mediabox" href="#URL_DOCUMENT">voir le fichier</a>
</label>
</div>
</BOUCLE_doc>
</div>
</div>
</B_doc>
```
3 branchements possibles :
* gamumail/SLUG_debutform.html -> au début du form
* gamumail/SLUG_soustexte.html -> sous le contenu du mail, avant les pièces jointes
* gamumail/SLUG_fichier.html -> à la fin du formulaire
- gamumail/SLUG_debutform.html -> au début du form
- gamumail/SLUG_soustexte.html -> sous le contenu du mail, avant les pièces jointes
- gamumail/SLUG_fichiers.html -> à la fin du formulaire
### aide à la rédaction du contenu:
- le fichier **gamumail/remplacement_slugs.html** s'affiche en bas de la page de configuration des modèles **inclure/gamumail_config.html**
et du formulaire d'envoi **formulaires/gamumail.html** : il permet de lister les remplacements effectués pour **tous les modèles** qui sont :
- les génériques fournis par Gamumail par la fonction `inc_gamumail_remplacements_dist()` du fichier `inc/gamumail_remplacements.php`
- ceux fournis par les plugins via le pipeline **remplacement_slugs** (cf ci-dessous)
et du formulaire d'envoi **formulaires/gamumail.html** : il permet de lister les remplacements effectués pour **tous les modèles** qui sont : - les génériques fournis par Gamumail par la fonction `inc_gamumail_remplacements_dist()` du fichier `inc/gamumail_remplacements.php` - ceux fournis par les plugins via le pipeline **remplacement_slugs** (cf ci-dessous)
- pour documenter les remplacements (pied de la page gamumail_config.html), chaque plugin doit renseigner ses remplacements dans l'array global `$GLOBALS['remplacements_gamumail']`
Exemple dans un fichier `prefixe_fonctions.php` :
```php
$GLOBALS['remplacements_gamumail']['@@num_facture@@'] = 'numéro de la facture';
```
- une page de test des slugs est fournie à l'URL **...?page=test_slug&slug=mail_libre&dest=27**
### exemple de page d'envoi de mail en choisissant un slug parmi ceux existant :
```html
[(#AUTORISER{modifier,souscripteur,#ENV{id_auteur}}|sinon_interdire_acces)]
@ -73,9 +91,11 @@ $GLOBALS['remplacements_gamumail']['@@num_facture@@'] = 'numéro de la facture';
```
### Dans le php
#### 1. Appel du formulaire
> Args du formulaire :
>
```php
/**
* formulaire générique pour envoyer des mails avec pieces attachés
@ -96,92 +116,95 @@ $GLOBALS['remplacements_gamumail']['@@num_facture@@'] = 'numéro de la facture';
function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){
}
```
#### argument $slug "no_gamumail"
Si $slug à pour valeur **no_gamumail** alors l'envoi est annulé
Exemple d'option à insérer dans un select sélecteur de slug :
```html
<option
value="no_gamumail"
[
(#ENV{slug}|=""
="{no_gamumail}|oui)"
selected="selected"
]
>
<:souscriptions:pas_de_mail_auto:>
</option>
```
#### argument Tclient
l'Argument $Tclient est utilisé pour récupérer des emails dans un ou X autres Objets SPIP
#### argument Tpdf : attacher des PDF avec contenu dynamique
- exemple d'appel pour 1 fichier PDF avec son contexte :
```html
[(#FORMULAIRE_GAMUMAIL{
#ENV{slug},
#ENV{email},
'',
#ARRAY{
fichier,pdf_guide,
nom,Fiche_guide,
contexte,#ARRAY{
id_article,#ENV{id_article},
type_guide,#ENV{type_guide,guide}
}
},
#ENV{redirect},
#ARRAY{
id_auteur,#ENV{id_auteur}
}
})]
[(#FORMULAIRE_GAMUMAIL{ #ENV{slug}, #ENV{email}, '', #ARRAY{ fichier,pdf_guide,
nom,Fiche_guide, contexte,#ARRAY{ id_article,#ENV{id_article},
type_guide,#ENV{type_guide,guide} } }, #ENV{redirect}, #ARRAY{
id_auteur,#ENV{id_auteur} } })]
```
le fichier PDF sera généré par SPIPDF avec l'URL suivante : `...spip.php?page=spipdf&spipdf=pdf_guide&id_article=1838&type_guide=guide`
- exemple d'appel pour 2 fichiers PDF générés par le même squelette (pdf_guide.html) mais avec chacun leur contexte :
```html
[(#FORMULAIRE_GAMUMAIL{
#ENV{slug},
#ENV{email},
'',
#ARRAY{
0,#ARRAY{
fichier,pdf_guide,
nom,Fiche_guide,
contexte,#ARRAY{
id_article,#ENV{id_article},
type_guide,guide,
}
},
1,#ARRAY{
fichier,pdf_guide,
nom,Fiche_guide_renfort,
contexte,#ARRAY{
id_article,#ENV{id_article},
type_guide,guide_renfort,
}
}
},
#ENV{redirect},
#ARRAY{
id_auteur,#ENV{id_auteur}
}
})]
[(#FORMULAIRE_GAMUMAIL{ #ENV{slug}, #ENV{email}, '', #ARRAY{ 0,#ARRAY{
fichier,pdf_guide, nom,Fiche_guide, contexte,#ARRAY{
id_article,#ENV{id_article}, type_guide,guide, } }, 1,#ARRAY{ fichier,pdf_guide,
nom,Fiche_guide_renfort, contexte,#ARRAY{ id_article,#ENV{id_article},
type_guide,guide_renfort, } } }, #ENV{redirect}, #ARRAY{
id_auteur,#ENV{id_auteur} } })]
```
/!\ en cas de plusieurs PDF :
- il faut une *clé unique* pour chaque #ARRAY (0, 1, 2... est une bonne solution)
- il faut une _clé unique_ pour chaque #ARRAY (0, 1, 2... est une bonne solution)
- dans l'#ARRAY contexte il faut que le dernier élément soit suivi d'une virgule ou d'une accolade fermante
#### 2. modification de chaque étape: charger / vérifier / traiter
#### 2. surcharges de chaque étape: charger / vérifier / traiter
Pour chaque étape, on peut modifier l'Array de sortie :
* charger -> $valeurs
* verifier -> $erreurs
* traiter -> $corps (array du message envoyé à facteur)
- charger -> $valeurs
- verifier -> $erreurs
- traiter -> $corps (array du message envoyé à facteur)
Voir **gamumail_fonctions.php** pour les arguments des fonctions de surcharge + exemples
Pour cela, il faut creer une fonction du type (qui utilise les memes arg que les fonctions CVT + premier arg l'Array que l'on veut modifier):
* pour charger : **gamumail/charger.php** pour tous les formulaires ou
* pour charger : **gamumail/SLUG_charger.php** avec une fonction :
Pour cela, il faut creer une fonction du type (qui utilise les memes arg que les fonctions CVT + premier arg l'Array que l'on veut modifier)
La surcharge pour tous les slugs (`gamumail_tous_...`) précède celle spécifique par slug : on peut donc utiliser les 2 successivement.
Syntaxe :
- pour charger pour tous les slugs : **gamumail/tous_charger.php** (fonction `gamumail_tous_charger()`)
- pour charger spécifique d'un slug : **gamumail/NOM_SLUG_charger.php** avec une fonction :
```php
function gamumail_SLUG_charger($valeurs, $options = []){
function gamumail_NOM_SLUG_charger($valeurs, $options = []){
return $valeurs;
}
```
* pour verifier : **gamumail/verifier.php** pour tous les formulaires ou
* pour verifier : **gamumail/SLUG_verifier.php** avec une fonction :
- pour verifier pour tous les slugs : **gamumail/tous_verifier.php** (fonction `gamumail_tous_verifier()`)
- pour verifier spécifique d'un slug : **gamumail/NOM_SLUG_verifier.php** avec une fonction :
```php
function gamumail_SLUG_verifier($erreurs, $options = []){
function gamumail_NOM_SLUG_verifier($erreurs, $options = []){
return $erreurs;
}
```
* pour traiter : **gamumail/SLUG_traiter.php** avec une fonction ex:
- pour traiter pour tous les slugs : **gamumail/tous_traiter.php** (fonction `gamumail_tous_traiter()`)
- pour traiter spécifique d'un slug : **gamumail/NOM_SLUG_traiter.php** avec une fonction par ex:
```php
function gamumail_contrat_resa_traiter($corps, $options = []){
function gamumail_NOM_SLUG_traiter($corps, $options = []){
if (array_key_exists('id_article', $options)) {
$htmlAdd = '';
$texteAdd = '';
@ -201,8 +224,11 @@ function gamumail_contrat_resa_traiter($corps, $options = []){
return $corps;
}
```
#### 3. Pipeline remplacements_slug pour le traitement du contenu des messages
Pour les remplacements des @@ et tout autre traitement du texte des mails on utilisera le pipeline **remplacements_slug** qui utilise les arguments suivants :
```php
* @param array $flux données du pipeline :
* $flux['data'] = $html
@ -210,24 +236,67 @@ Pour les remplacements des @@ et tout autre traitement du texte des mails on uti
* $flux['args']['destinataires'] = $destinataires
* $flux['args']['options'] = $options
* @return array $flux données du pipeline
function PREFIX_remplacements_slug($flux){
include_spip('gamumail_fonctions');
// remplacements statiques
if ($html = $flux['data']) {
$html = gamumail_remplacer_modele('url_page_commandes', url_absolue(generer_url_public('historique_commandes')), $html);
$html = gamumail_remplacer_modele('url_page_contrats', url_absolue(generer_url_public('mes_contrats')), $html);
}
// remplacements dynamiques
/*
* /!\ Attention, $flux['args'] peut etre un array cle -> valeur
* sans passer par un sous tab $args comme ici
*/
if ($args = $flux['args']['args']
and $html = $flux['data']
) {
if (isset($args['url_attestation'])) {
$html = gamumail_remplacer_modele('url_attestation', $args['url_attestation'], $html);
}
$flux['data'] = $html;
}
return $flux;
}
```
#### 4. Ajouter un header / footer dans le content html
on peut définir un header / footer pour les messages :
* gamumail/html_header.html => header pour tous les mails
* gamumail/html_footer.html => footer pour tous les mails
* gamumail/SLUG_html_header.html => pour les mails du modele SLUG
* gamumail/SLUG_html_footer.html => pour les mails du modele SLUG
#### 4. Pipeline post_gamumail_ok
Ce pipeline est appelé si le retour de l'envoi du gamumail est OK. Il permet, par exemple, à Paybyurl d'aller modifier le champ date_paybyurl_envoye pour que la date d'envoi soit mise à jour.
#### 5. Ajouter un header / footer dans le content html
on peut définir un header / footer pour les messages :
- gamumail/html_header.html => header pour tous les mails
- gamumail/html_footer.html => footer pour tous les mails
- gamumail/SLUG_html_header.html => pour les mails du modele SLUG
- gamumail/SLUG_html_footer.html => pour les mails du modele SLUG
#### 6. Utiliser l'inclure `<INCLURE{fond=inclure/fermer_modale,env}>` pour fermeture de la modale de gamumail
- cet inclure est appelé au début de `formulaire/gamumail.html` : par défaut il est vide
- un plugin peut arriver avec son fichier pour le surcharger afin de pouvoir intégrer du JS en fonction du message de retour `message_ok` du traiter de gamumail.php
- dans `gamumail.php`, la fonction `gamumail_traiter` ajoute en fin du message de retour OK `message_ok` le suffixe `@@gamumail_ok`
- il est donc possible de tester la présence de ce suffixe dans `message_ok` pour afficher du JS qui permet de refermer la modale dans laquelle est chargée gamumail
mais aussi de faire la mise à jour de l'affichage d'un bloc ajax dans la page appelante.
=> voir le code en commentaire dans le fichier `inclure/fermer_modale`
## API d'envoi de mails utilisant les slugs
### fonction envoyer_gamumail()
- exemple d'appel :
```php
$fonction = charger_fonction('envoyer_gamumail','inc');
$options = [
'debug' => false,
'args' => ['nb_parts' => intval(_request('nombre'))],
'options' => ['nb_parts' => intval(_request('nombre'))],
'pdfs' => [
[
'fichier' => 'pdf_attestation_souscription',
@ -238,7 +307,9 @@ $options = [
];
$fonction(lire_config('souscriptions/slug_souscription_validation'), $Tdest, $options);
```
- arguments :
```php
* @param string $slug
* @param string|array $destinataires = adresses mails et id_auteur séparées par , ou en array
@ -255,13 +326,27 @@ $fonction(lire_config('souscriptions/slug_souscription_validation'), $Tdest, $op
* 'nom' => 'nom_fichier_attache' ]
```
## Slugs et @@ fournis pour surcharges facultatives de SPIP pour permettre l'envoi des mails en Gamumail plutôt que via notification
### slug `valider_inscription` :
- message pour la validation de l'adresse mail lors de la création d'un compte avec le form `inscription`
- à activer via une surcharge de `action_inscrire_auteur_dist()` : cf plugin **sq_collecte/sq_collecte_fonctions.php**
- pour intégrer la définition du mot de passe dès l'inscription (sans le plugin inscription_motdepasse) + d'autres contrôles de l'inscription :
- pour la saisie surcharge du HTML du form d'inscription : cf plugin **sq_collecte/formulaires/inscription.html**
- pour les contrôles il faut surcharger `formulaires_inscription_verifier_dist()` : cf plugin **sq_collecte/sq_collecte_fonctions.php**
### slug `pass_oubli`
- message pour le reset du mot de passe
- à activer via une surcharge de `formulaires_oubli_traiter_dist()`: cf plugin **rocb/rocb_options.php**
## Outrepasser l'erreur de certificat auto-signé lors de devs en https local
=> dans le mes_options.php du site mettre :
```
```php
define('_DEBUG_AUTORISER', true);
```
ce qui permet d'activer les options de curl pour ne pas vérifier le certificat dans *charger_pdf.php* :
```
ce qui permet d'activer les options de curl pour ne pas vérifier le certificat dans _charger_pdf.php_ :
```php
// pour une connexion https locale avec certificat auto-signé
if (defined('_DEBUG_AUTORISER')) {
curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYHOST, false);

View file

@ -1,6 +1,8 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
defined('_GAMUMAIL_PREFIX_SLUG') || define('_GAMUMAIL_PREFIX_SLUG', "slug");
/**
* créer un slug Gamumail
*
@ -30,7 +32,8 @@ function action_creer_slug_dist($slug = null, $opt = [], $ecraser = false){
];
if ($id_slug = objet_inserer('gamumail', null, $set)) {
$set = ['slug' => 'slug_'.$id_slug];
$slug = getSlugGamumail($id_slug);
$set = ['slug' => $slug];
sql_updateq('spip_gamumails', $set, 'id_gamumail = '.$id_slug);
}
} else {
@ -57,3 +60,16 @@ function action_creer_slug_dist($slug = null, $opt = [], $ecraser = false){
include_spip('inc/invalideur');
suivre_invalideur("id='id_gamumail/1'");
}
function getSlugGamumail(int $id_gamumail, int|null $suffix = 0):string {
$slug = _GAMUMAIL_PREFIX_SLUG .'_'.$id_gamumail;
if ($suffix) {
$slug .= '_'.$suffix;
}
if (sql_countsel('spip_gamumails', ['slug='.sql_quote($slug)])) {
$suffix++;
return getSlugGamumail($id_gamumail, $suffix);
}
return $slug;
}

View file

@ -56,22 +56,25 @@ function gamumail_declarer_tables_objets_sql($tables) {
'statut' => 'varchar(20) DEFAULT "0" NOT NULL',
'public' => 'varchar(20) DEFAULT "oui" NOT NULL',
'editable' => 'varchar(5) DEFAULT "oui" NOT NULL',
'maj' => 'TIMESTAMP'
'date' => 'datetime NOT NULL DEFAULT "0000-00-00 00:00:00"',
'maj' => 'TIMESTAMP',
'rang' => 'smallint(6) NOT NULL'
),
'key' => array(
'PRIMARY KEY' => 'id_gamumail',
'KEY statut' => 'statut',
),
'titre' => 'slug AS titre, "" AS lang',
// 'titre' => 'slug AS titre, "" AS lang',
#'date' => '',
'champs_editables' => array('slug', 'sujet', 'texte','titre', 'editable'),
'champs_versionnes' => array('slug', 'sujet', 'texte','titre', 'editable'),
'champs_editables' => array('slug', 'sujet', 'texte','titre', 'editable', 'public', 'id_docs', 'rang', 'statut', 'date'),
'champs_versionnes' => array('slug', 'sujet', 'texte','titre', 'editable', 'public', 'id_docs', 'rang', 'statut', 'date'),
'rechercher_champs' => array("slug" => 8),
'tables_jointures' => array(),
'statut'=> array(
array(
'champ' => 'statut',
'publie' => 'publie',
'previsu' => '!',
'exception' => array('statut','tout')
)
),

View file

@ -2,5 +2,8 @@
[(#AUTORISER{configurer,gamumail}|sinon_interdire_acces)]
<div class="inner">
<div class="mt-3 mb-7">
<h1 class="mb-3">Configuration de Gamumail</h1>
<INCLURE{fond=inclure/gamumail_config,env}>
</div>
</div>

View file

@ -6,6 +6,6 @@
#ENV{dest} = string|array destinataire(s)
@return : le résultat de la fonction envoyer_gamumail() en mode debug
]
[(#ENV{slug}|tester_slug{#ENV{dest}})]
[(#ENV{slug}|tester_slug{#ENV{dest}, #ARRAY{id_dossier,#ENV{id_dossier}}})]

View file

@ -20,14 +20,17 @@
overflow: hidden;
margin: 3px 0;
}
.tag-editor div {
float: left;
padding: 0 4px;
}
.tag-editor .placeholder {
padding: 0 8px;
color: #bbb;
}
.tag-editor .tag-editor-spacer {
padding: 0;
width: 8px;
@ -35,6 +38,7 @@
color: transparent;
background: none;
}
.tag-editor input {
vertical-align: inherit;
border: 0;
@ -50,15 +54,18 @@
background: none;
color: #444;
}
/* hide original input field or textarea visually to allow tab navigation */
.tag-editor-hidden-src {
position: absolute !important;
left: -99999px;
}
/* hide IE10 "clear field" X */
.tag-editor ::-ms-clear {
display: none;
}
/* tag style */
.tag-editor .tag-editor-tag {
/*padding-left: 5px; color: #46799b; background: #e0eaf1; white-space: nowrap;*/
@ -71,6 +78,7 @@
cursor: pointer;
border-radius: 4px 0 0 4px;
}
/* delete icon */
/*.tag-editor .tag-editor-delete { background: #e0eaf1; cursor: pointer; border-radius: 0 2px 2px 0; padding-left: 3px; padding-right: 4px; }*/
.tag-editor .tag-editor-delete {
@ -80,10 +88,12 @@
padding-left: 3px;
padding-right: 4px;
}
.tag-editor .tag-editor-delete i {
line-height: 18px;
display: inline-block;
}
/*.tag-editor .tag-editor-delete i:before { font-size: 16px; color: #8ba7ba; content: "×"; font-style: normal; }*/
.tag-editor .tag-editor-delete i:before {
font-size: 16px;
@ -91,14 +101,17 @@
content: '×';
font-style: normal;
}
.tag-editor .tag-editor-delete:hover i:before {
color: #d65454;
}
.tag-editor .tag-editor-tag.active+.tag-editor-delete,
.tag-editor .tag-editor-tag.active+.tag-editor-delete i {
visibility: hidden;
cursor: text;
}
.tag-editor .tag-editor-tag.active {
background: none !important;
}
@ -111,9 +124,11 @@
cursor: default;
font-size: 14px;
}
.ui-front {
z-index: 9999;
}
.ui-menu {
list-style: none;
padding: 1px;
@ -121,21 +136,26 @@
display: block;
outline: none;
}
.ui-menu .ui-menu-item a {
text-decoration: none;
display: block;
padding: 2px 0.4em;
line-height: 1.4;
min-height: 0; /* support: IE7 */
min-height: 0;
/* support: IE7 */
}
.ui-widget-content {
border: 1px solid #bbb;
background: #fff;
color: #555;
}
.ui-widget-content a {
color: #46799b;
}
.ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover,
.ui-state-focus,
@ -143,6 +163,7 @@
.ui-widget-header .ui-state-focus {
background: #e0eaf1;
}
.ui-helper-hidden-accessible {
display: none;
}
@ -151,47 +172,101 @@
.formulaire_gamumail {
padding-top: 0;
}
.formulaire_gamumail .editer {
padding-top: 0;
}
.editer_pour {
display: flex;
}
.editer_pour label {
width: 50px;
}
.editer_envoi_separe {
display: flex;
}
.editer_cc {
display: flex;
}
.editer_cc label {
width: 50px;
}
.editer_cci {
display: flex;
}
.editer_cci label {
width: 50px;
}
.editer_repondre_a {
display: flex;
}
.editer_repondre_a label {
width: 120px;
}
.reponse_formulaire {
padding: 1rem;
margin-bottom: 2rem;
font-weight: bold;
}
.reponse_formulaire_erreur, .editer .erreur_message {
.reponse_formulaire_erreur,
.editer .erreur_message {
background-color: #f7d1d1;
border: solid 2px #f00;
display: block;
}
.reponse_formulaire_ok {
background-color: #c4ecd6;
border: solid 2px #080;
}
.remplacements_slugs {
margin-top: 3rem;
}
.formulaire_gamumail .boutons {
margin-top: 3rem;
}
.formulaire_gamumail .btn {
font-size: 3rem;
}
.gestion_documents {
display:flex;
flex-direction:column;
gap: 20px;
}
.gestion_documents .colonne_droite {
border-bottom: 1px solid #CECECE;
margin-bottom: 20px;
}
.colonne_droite .dropfile{
display: flex;
gap: 5px;
align-items: center;
}
@media (min-width: 780px) {
.gestion_documents {
flex-direction: row;
}
.colonne_gauche {
width: 50%;
}
.colonne_droite {
width: 50%;
order: 2;
}
}

View file

@ -2,18 +2,27 @@
<link rel="stylesheet" href="[(#CHEMIN{css/gamumail.css}|timestamp)]" type="text/css" media="screen" charset="utf-8" />
[(#REM)
inclure vide pour surcharge si besoin de passer du JS en fonction du retour du traiter du form
(voir inclure/fermer_modale.html pour exemple permettant de fermer une modalbox contenant ce formulaire + README)
]<INCLURE{fond=inclure/fermer_modale,env}>
[(#REM)
récupérer la langue du destinataire dans le paramètre options/lang
] #SET{lang_dest, #ENV{options/lang}|sinon{#CONFIG{langue_site}}}
<div class="formulaire_spip formulaire_#FORM">
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok}|explode{@@}|table_valeur{0})</p>]
<form name="formulaire_#FORM" action="#ENV{action}" method="post"><div>
#ACTION_FORMULAIRE{#ENV{action}}
#SET{fichier,#SLUG|concat{_debutform}}
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui)
<INCLURE{fond=gamumail/#GET{fichier},env}>
<INCLURE{fond=gamumail/#GET{fichier},env,lang=#GET{lang_dest}}>
]
<div class="editer_groupe">
#SET{name,pour}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
@ -24,6 +33,25 @@
<input required type="text" class="text tagEditor" name="#GET{name}" id="#GET{name}" value="#ENV{#GET{name}}" >
</div>
</div>
<BOUCLE_testEnvoiSepare(CONDITION){si #ENV{envoi_separe}|oui}>
<div class="editer_groupe">
#SET{name,envoi_separe}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label> Envoi séparé (1 mail par destinataire)</label>
<div class="choix">
<input type="radio" class="radio" name="#GET{name}" value="" id="#GET{name}_non"[ (#ENV{#GET{name}}|non|?{checked="checked"})] >
<label for="#GET{name}_non">Non</label>
</div>
<div class="choix">
<input type="radio" class="radio" name="#GET{name}" value="oui" id="#GET{name}_oui"[ (#ENV{#GET{name}}|oui|?{checked="checked"})] >
<label for="#GET{name}_oui">Oui</label>
</div>
</div>
</div>
</BOUCLE_testEnvoiSepare>
<div class="editer_groupe">
#SET{name,cc}
@ -47,12 +75,25 @@
</div>
</div>
<BOUCLE_testRepondreA(CONDITION){si #ENV{repondre_a}}>
<div class="editer_groupe">
#SET{name,repondre_a}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}">Répondre à</label>
[<span class="erreur_message">(#GET{erreurs})</span>]
<input type="text" class="text mail_repondre_a tagEditor" name="#GET{name}" id="#GET{name}" value="#ENV{#GET{name}}" >
</div>
</div>
</BOUCLE_testRepondreA>
<div class="editer_groupe">
#SET{name,sujet}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}">Sujet</label>
<label for="#GET{name}"><:gamumail:sujet:></label>
[<span class="erreur_message">(#GET{erreurs})</span>]
<input required type="text" class="text sujet" name="#GET{name}" id="#GET{name}" value="#ENV{#GET{name}}" >
</div>
@ -63,41 +104,28 @@
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<label for="#GET{name}">Texte</label>
<label for="#GET{name}"><:gamumail:corps_message:></label>
[<span class="erreur_message">(#GET{erreurs})</span>]
<textarea required class="textarea texte" name="#GET{name}" id="#GET{name}" rows="7">[(#ENV{#GET{name}})]</textarea>
</div>
</div>
<div class="gestion_documents">
<div class="colonne_droite">
<h2><:gamumail:fichiers_televerser:></h2>
<INCLURE{fond=inclure/bigform,env,accept=#LISTE{image/*, application/pdf},suffix_liste_fichiers=gamumail}>
</div>
<div class="colonne_gauche">
#SET{fichier,#SLUG|concat{_soustexte}}
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui)
<INCLURE{fond=gamumail/#GET{fichier},env}>
<INCLURE{fond=gamumail/#GET{fichier},env,lang=#GET{lang_dest}}>
]
#SET{name,Tpdfs_ok}
<B_pdf>
<h2><:gamumail:pdf_envoyes:></h2>
<div class="editer_groupe">
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<BOUCLE_pdf(DATA){source tableau, #ENV{TFichierpdfs}}>
<div class="choix">
<input type="checkbox" class="checkbox" name="#GET{name}[]" value="[(#VALEUR|table_valeur{fichier})]_#CLE" id="#GET{name}_#COMPTEUR_BOUCLE" checked="checked" >
[(#SET{url_pdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,[(#VALEUR|table_valeur{fichier})]})]})]
<BOUCLE_options(DATA){source tableau, #VALEUR|table_valeur{contexte}}>
[(#SET{url_pdf,[(#GET{url_pdf}|parametre_url{#CLE,#VALEUR})]})]
</BOUCLE_options>
<label for="#GET{name}_#COMPTEUR_BOUCLE">[(#VALEUR|table_valeur{nom})] : <a href="#GET{url_pdf}">voir le PDF</a></label>
</div>
</BOUCLE_pdf>
</div>
</div>
</B_pdf>
<INCLURE{fond=gamumail/inc-pdf_envoyes,env}>
#SET{name,docs_spip}
<div class="documents_attaches">
<h2><:gamumail:documents_attaches:></h2>
<div class="editer_groupe">
<div class="w500p">
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{erreurs}|oui)erreur]">
<div class="choix">
@ -105,18 +133,38 @@
<label for="#GET{name}"><:gamumail:id_docs_attaches:></label>
<input type="text" class="text" name="#GET{name}" value="[(#ENV{#GET{name}})]" id="#GET{name}" >
</div>
<B_docs_spip>
<div class="details_docs_spip">
<ul>
<BOUCLE_docs_spip(DOCUMENTS){tous}{id_document IN #ENV{#GET{name}}|explode{','}}>
<li><strong>#ID_DOCUMENT :</strong> #TITRE ([<a class="mediabox" href="#URL_DOCUMENT">(#FICHIER|basename)</a>])</li>
</BOUCLE_docs_spip>
</ul>
</div>
</B_docs_spip>
</div>
</div>
</B_doc>
</div>
#SET{fichier,all_fichiers}
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui)
#SET{erreurs,#ENV**{erreurs}|table_valeur{Tid_doc}}
[<span class="erreur_message">(#GET{erreurs})</span>]
<INCLURE{fond=gamumail/#GET{fichier},env,slug=#SLUG,options=#ENV{options}}>
]
#SET{fichier,#SLUG|concat{_fichiers}}
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui)
#SET{erreurs,#ENV**{erreurs}|table_valeur{Tid_doc}}
[<span class="erreur_message">(#GET{erreurs})</span>]
<INCLURE{fond=gamumail/#GET{fichier},env}>
<h2><:gamumail:fichiers_annexes:></h2>
<INCLURE{fond=gamumail/#GET{fichier},env,options=#ENV{options}}>
]
</div>
</div>
<div class="boutons">
<hr>
<div class="boutons text-center">
<button type="submit" class="btn"><:gamumail:envoyer:></button>
</div>
</div></form>

View file

@ -10,9 +10,11 @@ include_spip('inc/filtres');
* @param string $destinataires = adresses mails et id_auteurs séparées par , ou en array
* si un des destinataire est au format numérique, on considère que c'est un id_auteur et on va choper son mail dans spip_auteurs
* @param array $Tclient = un ou plusieurs mails de destinataires sortis d'une table objet spécifique
* de la forme []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email']
* de la forme []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email', 'copie' => 'cc|cci'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email']
* le paramètre 'copie' est facultatif : cc ou cci pour mettre un destinataire en copie, '' par défaut = destinataire principal
* @param array $Tpdf = un ou plusieurs fichiers PDF générés par spiPDF (le contexte permet la personnalisation du contenu)
* []['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] ou ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]]
* []['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3, 'lang' => 'en']] ou ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3, 'lang' => 'en']]
* NB: si besoin que le PDF généré soit dans une langue précise, il faut passer la passer en paramètre "lang" dans le contexte
* @param string $redirect
* @param array $options = un gros fourre-tout sous forme d'un array
* utilisé en particulier par les inclure HTML de gamumail/#SLUG_soustexte et gamumail/#SLUG_fichiers
@ -21,11 +23,19 @@ include_spip('inc/filtres');
*
*/
function formulaires_gamumail_charger_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){
//var_dump($Tpdf) ;
$Tmails = [];
if (!is_array($destinataires)) {
$Tcc = lire_config('gamumail/mail_cc') !== '' ? explode(',', lire_config('gamumail/mail_cc', '')) : [];
$Tcci = lire_config('gamumail/mail_cci') !== '' ? explode(',', lire_config('gamumail/mail_cci', '')) : [];
$Trepondre_a = lire_config('gamumail/mail_repondre_a') !== '' ? explode(',', lire_config('gamumail/mail_repondre_a', '')) : [];
if (!empty($destinataires) and !is_array($destinataires)) {
$destinataires = explode(',', $destinataires);
} else {
$destinataires = [];
}
foreach ($destinataires as $dest) {
if (is_numeric($dest)) {
if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
@ -45,8 +55,13 @@ function formulaires_gamumail_charger_dist($slug, $destinataires = 0, $Tclient =
$table = table_objet_sql($o['objet']);
$id = id_table_objet($o['objet']);
$mail = sql_getfetsel("{$o['champ']}", $table, "$id=".intval($o['id_objet']));
$copie = (isset($o['copie']) and in_array($o['copie'], ['cc', 'cci'])) ? $o['copie'] : false;
if (email_valide($mail)) {
if (!$copie) {
$Tmails[] = $mail;
} else {
$copie == 'cc' ? $Tcc[] = $mail : $Tcci[] = $mail;
}
}
}
}
@ -57,36 +72,59 @@ function formulaires_gamumail_charger_dist($slug, $destinataires = 0, $Tclient =
$Tpdf = [$Tpdf];
}
foreach ($Tpdf as $id => $pdf) {
//$TFichierPdf[] = $pdf['fichier'];
$TFichierPdf[$id] = $pdf;
//$options[$id] = $pdf;
}
}
$TFichierPdf = pipeline('gamumail_filtrer_tPDF', [
'args' => [
'TFichierPdf' => $TFichierPdf
],
'data' => $TFichierPdf
]
);
$gamuMail = [];
if (!empty($slug)) {
$gamuMail = sql_fetsel('sujet, texte, id_docs', 'spip_gamumails', 'slug='.sql_quote($slug));
}
$texte = $gamuMail['texte'] ?? '';
$sujet = $gamuMail['sujet'] ?? '';
// faire les remplacement <multi> selon la langue du destinataire (passée en $options[lang])
if (!empty($options['lang']) && in_array($options['lang'], liste_options_langues('var_lang'))) {
$texte = extraire_multi($texte, $options['lang']);
$sujet = extraire_multi($sujet, $options['lang']);
}
$valeurs = array(
"slug" => $slug,
'sujet' => $gamuMail['sujet'],
'texte' => $gamuMail['texte'],
'sujet' => $sujet,
'texte' => $texte,
'pour' => implode(',', $Tmails),
'cc' => lire_config('gamumail/mail_cc'),
'cci' => lire_config('gamumail/mail_cci'),
'cc' => implode(',', $Tcc),
'cci' => implode(',', $Tcci),
'repondre_a' => implode(',', $Trepondre_a),
'TFichierpdfs' => $TFichierPdf,
'Tpdfs_ok' => [],
'docs_spip' => $gamuMail['id_docs'],
'docs_spip' => $gamuMail['id_docs'] ?? '',
'Tid_fichiers' => [],
'options' => $options
'options' => $options,
'envoi_separe' => $options['envoi_separe'] ?? ''
);
//var_dump($valeurs);
// surcharges charger
if ($f = charger_fonction('charger', 'gamumail', true)) {
// surcharges charger : d'abord les surcharges pour tous les slugs (tous_charge.php) puis les spécifiques par slug (nom_slug_charger.php)
if ($f = charger_fonction('tous_charger', 'gamumail', true)) {
$valeurs = $f($valeurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
}
if ($f = charger_fonction($slug . '_charger', 'gamumail', true)) {
$valeurs = $f($valeurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
}
$rep = session_get('id_auteur') . '_' . session_get('login');
supprimer_repertoire(_DIR_TMP . 'bigupload/final/'.$rep);
$valeurs['_bigup_rechercher_fichiers'] = true;
return $valeurs;
}
@ -101,10 +139,14 @@ function formulaires_gamumail_verifier_dist($slug, $destinataires = 0, $Tclient
if (preg_match('/[^a-zA-Z0-9_\-]/', $slug)) {
$erreurs['message_erreur'] = _T("gamumail:erreur_format_slug");
}
$res = sql_fetsel('slug', 'spip_gamumails', 'slug = "'.$slug.'"');
if (!$res) {
$erreurs['message_erreur'] = _T("gamumail:pas_de_slug");
}
/*
* Finalement on accepte d'utiliser gamumail sans slug
* Je commente les lignes ci dessous
*/
// $res = sql_fetsel('slug', 'spip_gamumails', 'slug = "'.$slug.'"');
// if (!$res) {
// $erreurs['message_erreur'] = _T("gamumail:pas_de_slug");
// }
// vérif des destinataires
$Tid_erreur = $Tmails_erreur = [];
@ -160,36 +202,53 @@ function formulaires_gamumail_verifier_dist($slug, $destinataires = 0, $Tclient
}
}
// surcharges verifier
if ($f = charger_fonction('verifier', 'gamumail', true)) {
// surcharges verifier : d'abord les surcharges pour tous les slugs (tous_verifier.php) puis les spécifiques par slug (nom_slug_verifier.php)
if ($f = charger_fonction('tous_verifier', 'gamumail', true)) {
$erreurs = $f($erreurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
}
if ($f = charger_fonction($slug . '_verifier', 'gamumail', true)) {
$erreurs = $f($erreurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
}
/*
* Verification des fichiers téléversés
*/
defined('_IMG_MAX_WIDTH') || define('_IMG_MAX_WIDTH', 2048);
$options = [
'mime' => 'tout_mime',
'dimension_max' => [
'largeur' => 10000,
'hauteur' => 10000,
]
];
$bigform = charger_fonction('bigform_verifier','inc');
$bigform($options,$erreurs);
return $erreurs;
}
function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{
$retour = [];
// blocage de l'envoi par appel du pseudo-slug no_gamumail
if ($slug === 'no_gamumail') {
$retour['message_ok'] = _T('gamumail:message_no_gamumail');
if ($redirect AND $redirect != '') {
$retour['redirect'] = $redirect;
}
spip_log("Pas d'envoi de mail pour cause de slug no_gamumail","gamumail");
return $retour;
}
include_spip('inc/texte');
include_spip('classes/facteur');
$retour = array();
$envoi_separe = _request('envoi_separe') ?? '';
$options['envoi_separe'] = $envoi_separe;
$pour = _request('pour');
$cc = _request('cc');
$cci = _request('cci');
$sujet = _request('sujet');
$html = propre(_request('texte'));
$docs_spip = _request('docs_spip');
$Tpdfs_ok = _request('Tpdfs_ok');
$Tid_doc = _request('Tid_doc');
$texte = facteur_mail_html2text($html);
$pour = explode(',', $pour);
$cc = explode(',', $cc);
$cci = explode(',', $cci);
$destinataires = [];
foreach ($pour as $dest) {
@ -197,12 +256,74 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
$destinataires[] = $mail;
}
}
elseif (email_valide($dest)) {
} elseif (email_valide($dest)) {
$destinataires[] = $dest;
}
}
/*
* on recupère d'éventuels fichiers téléversés
*/
include_spip('inc/joindre_document');
set_request('joindre_upload','ok');
$Tfiles = joindre_trouver_fichier_envoye();
if (!is_array($Tfiles)) {
$Tfiles = [];
}
if (empty($envoi_separe)) {
gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $Tfiles, $redirect, $retour);
} else {
$ok = true;
foreach ($destinataires as $d) {
$r = gamuSend($slug, $options, [$d], $Tclient, $Tpdf, $Tfiles, $redirect);
if (!$r) {
$ok = false;
}
}
if (!$ok) {
$retour['message_erreur'] = _T("gamumail:erreur_envoi_mail");
}
else {
$retour['message_ok'] = _T('gamumail:mail_envoye');
// dans le retour message_ok ajouter que le gamumail est OK
$retour['message_ok'] .= '@@gamumail_ok';
}
}
if ($redirect AND $redirect != '') {
$retour['redirect'] = $redirect;
}
return $retour;
}
function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $Tfiles, $redirect, &$retour = []) {
$cc = _request('cc') ?? '';
$cci = _request('cci') ?? '';
$repondre_a = _request('repondre_a') ?? '';
$cc = explode(',', $cc);
$cci = explode(',', $cci);
$Tcci_gamuza = $GLOBALS['gamuza_mail_cci'] ?? [];
$cci = array_merge($cci, $Tcci_gamuza);
$repondre_a = explode(',', $repondre_a);
$sujet = _request('sujet');
$html = propre(_request('texte'));
$docs_spip = _request('docs_spip');
$Tpdfs_ok = _request('Tpdfs_ok');
$Tid_doc = _request('Tid_doc');
$texte = facteur_mail_html2text($html);
$args = $options;
$args['slug'] = $slug;
$args['destinataires'] = $destinataires;
$pieces_jointes = [];
if ($f = charger_fonction('traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $destinataires, $Tclient, $Tpdf);
@ -215,8 +336,15 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
$docs_spip = ($docs_spip != '' ? explode(',', $docs_spip) : []);
if (!empty($docs_spip)) {
foreach ($docs_spip as $id_document) {
$Tdocument = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_document));
$destination = _DIR_IMG.$Tdocument['fichier'];
$protected = '';
$Tdocument = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
if (
array_key_exists('protected', $Tdocument)
and $Tdocument['protected'] === 'oui'
) {
$protected = 'PROTECTED/';
}
$destination = _DIR_IMG.$protected.$Tdocument['fichier'];
$extension = $Tdocument['extension'];
if ($Tdocument['titre']) {
$nom_fichier = $Tdocument['titre'] .".".$extension;
@ -228,7 +356,9 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => $type_mime
'mime' => $type_mime,
'quoi' => 'docs_spip',
'qui' => $id_document
];
}
}
@ -249,10 +379,33 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => $type_mime
'mime' => $type_mime,
'quoi' => 'docs_spip',
'qui' => $id_doc
];
}
}
// les documents par tFiles (téléversés)
$tFilename = [];
if (!empty($Tfiles)) {
include_spip('inc/documents');
$rep = sous_repertoire(_DIR_CACHE . 'bigform');
foreach ($Tfiles as $fichier) {
$filename = $rep . $fichier['name'];
$tFilename[] = $filename;
deplacer_fichier_upload($fichier['tmp_name'], $filename);
$pieces_jointes[] = [
'chemin' => $filename,
'nom' => $fichier['name'],
'encodage' => 'base64',
'mime' => $fichier['type'],
'quoi' => 'televerser',
'qui' => $fichier['name']
];
}
}
// les pdfs générés en fonction du contexte
$Tpdf_del = [];
if (!empty($Tpdfs_ok) and is_array($Tpdfs_ok)) {
@ -260,11 +413,9 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
$Tpdf = [$Tpdf];
}
//var_dump($Tpdf);
//var_dump($Tpdfs_ok);
$recup_pdf = charger_fonction('charger_pdf','inc');
foreach ($Tpdfs_ok as $pdf) {
//var_dump($pdf);
$nom = "mon_fichier";
foreach ($Tpdf as $cle => $p) {
if ($p['fichier'].'_'.$cle === $pdf) {
$fichier = $p['fichier'];
@ -272,8 +423,22 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
$nom = isset($p['nom']) ? $p['nom'] : $fichier;
}
}
$pdf = $recup_pdf($fichier, $c);
//var_dump($pdf);
$nom = pipeline('remplacements_slug', array(
'args' => $args,
'data' => $nom
));
$c = pipeline('tpdf_charger_contexte', [
'args' => [
'destinataires' => $destinataires,
'contexte' => $c,
'options' => $options
], 'data' => $c
]);
$pdf = $recup_pdf($fichier, $c, $args);
if (!empty($pdf)) {
$nom_fichier = $nom.'.pdf';
$destination = _DIR_TMP.basename($nom_fichier);
$Tpdf_del[] = $destination;
@ -282,11 +447,27 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => 'application/pdf'
'mime' => 'application/pdf',
'quoi' => 'pdf_genere',
'qui' => $fichier
];
}
}
//var_dump($pieces_jointes);die;
}
if ($f = charger_fonction('traiter_pieces_jointes', 'gamumail', true)) {
$pc = $f($slug, $options, $destinataires, $Tclient, $Tpdf);
if (!empty($pc)) {
$pieces_jointes[] = $pc;
}
}
if ($f = charger_fonction($slug . '_traiter_pieces_jointes', 'gamumail', true)) {
$pc = $f($options, $destinataires, $Tclient, $Tpdf);
if (!empty($pc)) {
$pieces_jointes[] = $pc;
}
}
$html_header = '';
if (find_in_path('gamumail/'.$slug .'_html_header.html')) {
$html_header = recuperer_fond('gamumail/'.$slug . '_html_header', $options);
@ -303,36 +484,71 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
}
$html = $html_header . $html . $html_footer;
// pipeline pour les traitement du contenu des slugs spécifiques de chaque plugin
$args = $options;
$args['slug'] = $slug;
$args['destinataires'] = $destinataires;
// pipeline pour les traitements du contenu des slugs spécifiques de chaque plugin
$html = pipeline('remplacements_slug', array(
'args' => $args,
'data' => $html
));
// traitement des remplacements génériques fournis par Gamumail
$remplacement_generiques = charger_fonction('gamumail_remplacements', 'inc');
$html = $remplacement_generiques($args, $html);
$texte = facteur_mail_html2text($html);
$corps = [
'html' => $html,
'texte' => $texte,
'cc' => $cc,
'cci' => $cci,
'bcc' => $cci,
'pieces_jointes' => $pieces_jointes
];
if ($repondre_a) {
$corps['repondre_a'] = $repondre_a;
}
/*
// surcharges de traiter : d'abord les surcharges pour tous les slugs (tous_traiter.php) puis les spécifiques par slug (nom_slug_traiter.php)
if ($f = charger_fonction('traiter', 'gamumail', true)) {
$corps = $f($corps, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
}
*/
// appel d'une éventuelle fonction de traitement du contenu spécifique du slug
if ($f = charger_fonction($slug . '_traiter', 'gamumail', true)) {
$corps = $f($corps, $options, $slug, $destinataires);
}
// Gestion des variables dans le sujet du mail (spécifiques + génériques)
$sujet = pipeline('remplacements_slug',[
'args' => $args,
'data' => $sujet
]);
$sujet = $remplacement_generiques($args, $sujet);
// extraire les multi une fois les remplacements faits
$lang = $options['lang'] ?? lire_config('langue_site');
$sujet = extraire_multi($sujet, $lang);
$corps['html'] = extraire_multi($corps['html'], $lang);
$corps['texte'] = extraire_multi($corps['texte'], $lang);
$args['corps'] = $corps;
$args['sujet'] = $sujet;
// envoyer !
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
//var_dump($destinataires);
//var_dump($corps);
$ok = $envoyer_mail($destinataires, $sujet, $corps);
/*
* on vide les fichiers temp televerses par bigup
*/
if (count($tFilename)) {
foreach ($tFilename as $file) {
if (file_exists($file)) {
unlink($file);
}
}
}
if (!$ok) {
spip_log("Erreur d'envoi du mail : ","gamumail");
spip_log($corps,"gamumail");
@ -340,6 +556,15 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
}
else {
$retour['message_ok'] = _T('gamumail:mail_envoye');
// appel d'une éventuelle fonction de traitement si le mail est OK
$retour = pipeline('post_gamumail_ok', array(
'args' => $args,
'data' => $retour
));
// dans le retour message_ok ajouter que le gamumail est OK
$retour['message_ok'] .= '@@gamumail_ok';
}
// on supprime les pdfs temporaires
@ -349,9 +574,5 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
}
}
if ($redirect AND $redirect != '') {
$retour['redirect'] = $redirect;
}
return $retour;
return $ok;
}

View file

@ -0,0 +1,26 @@
#SET{name,Tpdfs_ok}
<div class="pdf_envoyes">
<B_pdf>
<h2><:gamumail:pdf_envoyes:></h2>
<div class="editer_groupe">
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]">
<BOUCLE_pdf(DATA){source tableau, #ENV{TFichierpdfs}}>
<div class="choix">
<input type="checkbox" class="checkbox" name="#GET{name}[]" value="[(#VALEUR|table_valeur{fichier})]_#CLE" id="#GET{name}_#COMPTEUR_BOUCLE" checked="checked" >
[(#SET{url_pdf, #URL_PAGE{spipdf}
|parametre_url{spipdf, #VALEUR|table_valeur{fichier}}
|parametre_url{lang, #GET{lang_dest}}
})]
<BOUCLE_options(DATA){source tableau, #VALEUR|table_valeur{contexte}}>
[(#SET{url_pdf,[(#GET{url_pdf}|parametre_url{#CLE,#VALEUR})]})]
</BOUCLE_options>
<label for="#GET{name}_#COMPTEUR_BOUCLE">[(#VALEUR|table_valeur{nom}|html_entity_decode)] : <a href="#GET{url_pdf}">voir le PDF</a></label>
</div>
</BOUCLE_pdf>
</div>
</div>
</B_pdf>
</div>

View file

@ -9,8 +9,11 @@
<h3 class="spip"><:gamumail:remplacements_disponibles:></h3>
<ul class="">
<BOUCLE_remplace(DATA){source tableau, #VAL|afficher_remplacements}>
<li><strong>[(#CLE)]</strong> : [(#VALEUR)]</li>
<li><span class="toClip pointer" data-clipboard-text="#CLE"><strong>[(#CLE)]</strong> </span>: [(#VALEUR)]</li>
</BOUCLE_remplace>
</ul>
<em><:gamumail:avertissement_remplacements:></em>
</div>
<script src="[(#CHEMIN{javascript/spip_barre.js}|timestamp)]" type="text/javascript"></script>
<script src="[(#CHEMIN{js/toClip.js}|timestamp)]" type="text/javascript"></script>

View file

@ -28,7 +28,7 @@ function gamumail_upgrade($nom_meta_base_version, $version_cible) {
$maj['create'] = array(
array('maj_tables', array('spip_gamumails')),
array('creer_compte_curl')
array('creer_compte_curl', 'creer_slugs'),
);
$maj['1.0.2'] = array(array('maj_tables', array('spip_gamumails')));
$maj['1.0.5'] = array(array('creer_compte_curl'));
@ -36,13 +36,55 @@ function gamumail_upgrade($nom_meta_base_version, $version_cible) {
$maj['1.0.11'] = array( array('maj_tables', array('spip_gamumails')));
$maj['1.0.12'] = array(array('creer_compte_curl'));
$maj['1.0.14'] = array(array('maj_tables', array('spip_gamumails')));
$maj['1.0.16'] = array(array('maj_tables', array('spip_gamumails')));
$maj['1.0.17'] = array(array('creer_slugs'));
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
// créer les slugs fournis avec Gamumail
function creer_slugs() {
if (!sql_countsel('spip_gamumails', 'slug="valider_inscription"')) {
$set = [
'slug' => 'valider_inscription',
'titre' => 'Message de création de compte : validation de l\'adresse mail',
'sujet' => '[@@nom_site@@] Création de votre compte',
'texte' => 'Bonjour @@nom@@,
Vous venez de créer votre compte sur @@url_site@@ avec l\'identifiant de connexion @@mail_compte@@.
[Merci de cliquer sur ce lien pour le confirmer et vous connecter->@@url_token@@].
Envoyé par @@nom_site@@ (@@url_site@@)',
'statut' => 'publie',
'public' => 'non',
'rang' => '999'
];
sql_insertq('spip_gamumails', $set);
}
if (!sql_countsel('spip_gamumails', 'slug="pass_oubli"')) {
$set = [
'slug' => 'pass_oubli',
'titre' => 'Message de reset du mot de passe',
'sujet' => '[@@nom_site@@] récupération de votre mot de passe',
'texte' => 'Pour récupérer votre accès @@nom_site@@ (@@url_site@@), merci de suivre ce lien :
@@url_spip_pass@@
Vous pourrez alors saisir un nouveau mot de passe et vous connecter au site
Envoyé par @@nom_site@@ (@@url_site@@)',
'statut' => 'publie',
'public' => 'non',
'rang' => '999'
];
sql_insertq('spip_gamumails', $set);
}
}
function creer_compte_curl(){
if (sql_countsel('nom', 'spip_auteurs', 'nom="curl_login"')){
if (sql_countsel('spip_auteurs', 'nom="curl_login"')){
return;
}
$mdp = uniqid(uniqid(),1);
@ -53,7 +95,9 @@ function creer_compte_curl(){
'statut' => '1comite'
];
$id_auteur = sql_insertq('spip_auteurs', $set);
include_spip('action/editer_auteur');
$id_auteur = auteur_inserer(null, $set);
if ($id_auteur) {
include_spip('inc/config');
ecrire_config('curl_login', $set['login']);

View file

@ -13,8 +13,9 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
function gamumail_TabClient($objet, $id_objet, $champ){
return compact('objet', 'id_objet', 'champ');
// retourne un array OK comme élément du paramètre $Tclient passé à gamumail_charger
function gamumail_TabClient($objet, $id_objet, $champ, $copie=''){
return compact('objet', 'id_objet', 'champ', 'copie');
}
function gamumail_supprimer_si_vide($v){

View file

@ -29,6 +29,11 @@ function crayons_determine_input_mode_type_gamumail($type, $champ, $sqltype) {
**/
$GLOBALS['remplacements_gamumail'] = [
'@@nom@@' => _T('gamumail:nom'),
'@@prenom@@' => _T('gamumail:prenom_sinon_nom'),
'@@url_site@@' => _T('gamumail:url_site'),
'@@nom_site@@' => _T('gamumail:nom_site'),
'@@url_raz_passe@@' => _T('gamumail:url_raz_passe'),
'@@url_spip_pass@@' => _T('gamumail:url_spip_pass'),
'@@date_maintenant@@' => _T('gamumail:date_maintenant'),
'@@date_heure_maintenant' => _T('gamumail:date_heure_maintenant'),
];

View file

@ -23,13 +23,24 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* $flux['args']['options'] = $options
* @return array $flux données du pipeline
*
**/
*
function gamumail_remplacements_slug($flux) {
return $flux;
}
}*/
/**
* pipeline pour déclencher une action si le gamumail est envoyé OK
* (typiquement enregistrer la date d'envoi)
*
* @param array $flux Données du pipeline
* @return array Données du pipeline
*
*
function gamumail_post_gamumail_ok($flux) {
return $flux;
}*/
/**
* Optimiser la base de données

View file

@ -3,35 +3,7 @@ if (!defined('_ECRIRE_INC_VERSION')){
return;
}
function inc_charger_pdf_dist($fichier_pdf, $contexte = []){
$login = lire_config('curl_login');
$password = lire_config('curl_mdp');
$url = $GLOBALS['meta']['adresse_site'].'/spip.php?page=spipdf&spipdf='.$fichier_pdf;
if (is_array($contexte) and count($contexte)) {
foreach ($contexte as $champ => $val) {
/* if (intval($val) === $val) {
// if (intval($val)) {
$val = intval($val);
} else {
$val = "$val";
}
*/
$url .= "&$champ=$val";
}
}
$CurlConnect = curl_init();
// pour une connexion https locale avec certificat auto-signé
if (defined('_DEBUG_AUTORISER')) {
curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYPEER, false);
}
curl_setopt($CurlConnect, CURLOPT_URL, $url);
curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1 );
//curl_setopt($CurlConnect, CURLOPT_POSTFIELDS, $request);
curl_setopt($CurlConnect, CURLOPT_USERPWD, $login.':'.$password);
$retour = curl_exec($CurlConnect);
curl_close($CurlConnect);
return $retour;
function inc_charger_pdf_dist($fichier_pdf, $contexte = [], $args = []){
$f = charger_fonction('generer_pdf','gamu');
return $f($fichier_pdf, $contexte);
}

View file

@ -12,7 +12,9 @@ if (!defined('_ECRIRE_INC_VERSION')){
* @param array $options :
* $options['debug' => true] pour afficher le $corps final sans envoyer le mail
* $options['cci' => true] pour passer les destinataires en cci si il y en a plus qu'un
* $options['pdfs' => [...]] array des fichiers PDF générés à attacher dont les éléments peuvent être :
* $options['dest_cci' => 'toto@truc.tld'] le destinataire (to) si $options['cci'] === true
* (sinon c'est le compte expéditeur du site)
* $options['pdfs' => [ 0 => [...], 1 => [...] ] array des fichiers PDF générés à attacher dont les éléments peuvent être :
* - soit un nom de squelette PDF
* - soit un array avec 3 éléments (seul le 1er est obligatoire):
* [ 'fichier' => 'squelette_PDF',
@ -26,24 +28,46 @@ if (!defined('_ECRIRE_INC_VERSION')){
* ]
* ]
* $options['args' => ['param_1' => 'valeur_1, 'param_2' => 'valeur_2', ...]]
* @param Array $Tid_doc_piece_jointe => Array id_doc a ajouter comme piece jointe
*
*/
function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_piece_jointe = []) {
//var_dump($options) ;die;
//var_dump($destinataires);
include_spip('inc/texte');
include_spip('classes/facteur');
$retour = array();
// blocage de l'envoi pour le pseudo-slug "no_gamumail"
if ($slug === 'no_gamumail') {
$retour['message_ok'] = _T('gamumail:message_no_gamumail');
spip_log("Pas d'envoi de mail pour cause de slug no_gamumail","gamumail");
return $retour;
}
// sécu
if (preg_match('/[^a-zA-Z0-9_\-]/', $slug)) {
$retour['message_erreur'] = _T("gamumail:erreur_format_slug");
return $retour;
}
// langue (par défaut langue du site)
$lang = !empty($options['lang']) ? $options['lang'] : lire_config('langue_site', 'fr');
$id_docs = '';
if ($slug === 'no_slug' && array_key_exists('message', $options)) {
$html = $options['message'];
if (array_key_exists('sujet', $options)) {
$sujet = $options['sujet'];
} else {
$sujet = array_shift($html);
}
} else {
// contenus du slug
$res = sql_fetsel('*', 'spip_gamumails', 'slug = "'.$slug.'"');
if ($res) {
$sujet = $res['sujet'];
$sujet = extraire_multi($res['sujet'], $lang);
$html = propre($res['texte']);
$id_docs = $res['id_docs'];
}
@ -51,6 +75,7 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
$retour['message_erreur'] = _T("gamumail:pas_de_slug");
return $retour;
}
}
// destinataires (id_auteur ou mails) => $pour[] est un array avec les adresses mails valides
if (!is_array($destinataires)) {
@ -71,14 +96,20 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
$non_vide = function ($elem) {
return ($elem != NULL AND $elem != '');
};
$cc = array_filter(explode(',', lire_config('gamumail/mail_cc')), $non_vide);
$cci = array_filter(explode(',', lire_config('gamumail/mail_cci')), $non_vide);
$cc = array_filter(explode(',', (lire_config('gamumail/mail_cc') ?? '')), $non_vide);
$cci = array_filter(explode(',', (lire_config('gamumail/mail_cci') ?? '')), $non_vide);
$Tcci_gamuza = $GLOBALS['gamuza_mail_cci'] ?? [];
$cci = array_merge($cci, $Tcci_gamuza);
// si on a plusieurs destinataires et $options['cci' => true] les passer en cci et mettre le compte expéditeur du site en to
if (count($pour) > 1 AND isset($options['cci']) AND $options['cci']) {
$cci = array_unique(array_merge($cci, $pour));
if (isset($options['dest_cci']) and email_valide($options['dest_cci'])) {
$pour = [$options['dest_cci']];
} else {
$pour = [lire_config('facteur/adresse_envoi_email',lire_config('email_webmaster'))];
}
}
// documents joints
$pieces_jointes = [];
@ -91,11 +122,21 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
$Tid_doc[] = $doc;
}
}
$Tid_doc = array_merge($Tid_doc, $Tid_doc_piece_jointe);
// récup des paramètres des docs à attacher
if (!empty($Tid_doc)) {
foreach ($Tid_doc as $id_document) {
$Tdocument = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_document));
$destination = _DIR_IMG.$Tdocument['fichier'];
$protected = '';
$Tdocument = sql_fetsel('*','spip_documents','id_document='.intval($id_document));
if (
array_key_exists('protected', $Tdocument)
and $Tdocument['protected'] === 'oui'
) {
$protected = 'PROTECTED/';
}
$destination = _DIR_IMG.$protected.$Tdocument['fichier'];
$extension = $Tdocument['extension'];
if ($Tdocument['titre']) {
$nom_fichier = $Tdocument['titre'] .".".$extension;
@ -103,6 +144,8 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
else {
$nom_fichier = basename($Tdocument['fichier']);
}
include_spip('bigup_fonctions');
$type_mime = bigup_get_mime_type_extension($extension);
$pieces_jointes[] = [
'chemin' => $destination,
@ -153,7 +196,6 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
$nom = array_key_exists('nom', $pdf) ? $pdf['nom'] : $pdf;
}
else break;
}
$recup_pdf = charger_fonction('charger_pdf','inc');
$pdf = $recup_pdf($sq_pdf, $contexte);
@ -169,6 +211,7 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
];
}
}
}
$html_header = '';
if (find_in_path('gamumail/'.$slug .'_html_header.html')) {
@ -190,22 +233,32 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
$args = $options;
$args['slug'] = $slug;
$args['destinataires'] = $pour;
$html = pipeline('remplacements_slug', array(
$html = pipeline('remplacements_slug', [
'args' => $args,
'data' => $html
));
]);
$sujet = pipeline('remplacements_slug',[
'args' => $args,
'data' => $sujet
]);
// traitement des remplacements génériques fournis par Gamumail
$remplacement_generiques = charger_fonction('gamumail_remplacements', 'inc');
$html = $remplacement_generiques($args, $html);
$sujet = $remplacement_generiques($args, $sujet);
// traduction des <multi> intégrés par les remplacements
$html = extraire_multi($html, $lang);
$sujet = extraire_multi($sujet, $lang);
include_spip('facteur_fonctions');
$texte = facteur_mail_html2text($html);
$corps = [
'html' => $html,
'texte' => $texte,
'cc' => $cc,
'cci' => $cci,
'bcc' => $cci,
'pieces_jointes' => $pieces_jointes
];
/*
@ -229,20 +282,23 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
echo '<br>$corps : ';
var_dump($corps);
$ok = true;
exit;
}
else {
//exit;
} else {
// pour ne pas avoir de warning de la fonction envoyer_mail() on doit lui passer un paramètre $from et un $header
$from = '';
$header = $options['header'] ?? '';
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
$ok = $envoyer_mail($pour, $sujet, $corps);
$ok = $envoyer_mail($pour, $sujet, $corps, $from, $header);
}
if (!$ok) {
spip_log("Erreur d'envoi du mail : ","gamumail");
spip_log($corps,"gamumail");
$retour['message_erreur'] = _T("gamumail:erreur_envoi_mail");
$retour['message_erreur'] = _L("gamumail:erreur_envoi_mail");
}
else {
$retour['message_ok'] = _T('gamumail:mail_envoye');
$retour['message_ok'] = _L('gamumail:mail_envoye');
}
// on supprime les pdfs temporaires

View file

@ -13,18 +13,56 @@ if (!defined('_ECRIRE_INC_VERSION')) {
*
**/
function inc_gamumail_remplacements_dist($args, $html) {
$slug = $args['slug'];
/**
* @@nom@@ => Prenom Nom | Nom (gère la présence/absence du champ prenom dans spip_auteurs)
* @@url_spip_pass@@
* ATTENTION, il ne faut passer QUE si @@url_spip_pass@@ est présent, car la fonction
* auteur_attribuer_jeton ne peut etre appeler qu'une fois, du mois, il faut utilser le jeton de son dernier appel.
**/
$nom = sql_getfetsel('nom', 'spip_auteurs', 'email='.sql_quote($args['destinataires'][0]));
if (strpos($html, '@@url_spip_pass@@') !== false) {
$url_spip_pass = '';
if (!empty($args['destinataires'][0])) {
$id_auteur = (int) sql_getfetsel('id_auteur', 'spip_auteurs', 'email='.sql_quote($args['destinataires'][0]));
include_spip('action/inscrire_auteur');
$cookie = auteur_attribuer_jeton($id_auteur);
$url_spip_pass = url_absolue(
generer_url_public('spip_pass', "p=$cookie"),
$GLOBALS['meta']['adresse_site'] . '/'
);
}
$html = gamumail_remplacer_modele('url_spip_pass', $url_spip_pass, $html);
}
/**
* @@url_token@@ pour le mail de validation de création de compte (slug valider_inscription) + @@mail_compte@@
* en SPIP 4.2+ on DOIT récupérer l'URL de validation générée par action_inscrire_auteur()
**/
if ($slug === 'valider_inscription'
&& ($id_auteur = $args['options']['id_auteur'])
&& ($url_confirm = $args['options']['url_confirm'])
) {
$auteur = sql_fetsel('email', 'spip_auteurs', 'id_auteur='.intval($id_auteur));
$html = str_replace('@@url_token@@', $url_confirm, $html);
$html = str_replace('@@mail_compte@@', $auteur['email'], $html);
}
/**
* @@nom@@ => $nom ou un espace pour vider le champ @@nom@@
**/
$nom = sql_getfetsel('nom', 'spip_auteurs', 'email='.sql_quote($args['destinataires'][0])) ?? ' ';
$html = gamumail_remplacer_modele('nom', ucwords($nom), $html);
/**
* @@prenom@@ => $prenom ou un espace pour vider le champ @@prenom@@
**/
$prenom = ' ';
$trouver_table = charger_fonction('trouver_table', 'base');
$desc = $trouver_table('spip_auteurs');
if (array_key_exists('prenom', $desc['field'])
and $prenom = sql_getfetsel('prenom', 'spip_auteurs', 'email='.sql_quote($args['destinataires'][0]))) {
$nom = $prenom.' '.$nom;
if (array_key_exists('prenom', $desc['field'])) {
$prenom = sql_getfetsel('prenom', 'spip_auteurs', 'email='.sql_quote($args['destinataires'][0])) ?? ' ';
}
$html = gamumail_remplacer_modele('nom', ucwords($nom), $html);
$html = gamumail_remplacer_modele('prenom', ucwords($prenom), $html);
/**
* @@url_site@@ => URL du site
@ -32,12 +70,24 @@ function inc_gamumail_remplacements_dist($args, $html) {
$url_site = lire_config('adresse_site');
$html = gamumail_remplacer_modele('url_site', $url_site, $html);
/**
* @@nom_site@@ => nom du site
**/
$nom_site = lire_config('nom_site');
$html = gamumail_remplacer_modele('nom_site', $nom_site, $html);
/**
* @@url_raz_passe@@ => URL de la page de récupération de mot de passe
**/
$url_raz_passe = url_absolue(generer_url_public('spip_pass'));
$html = gamumail_remplacer_modele('url_raz_passe', $url_raz_passe, $html);
/**
* @@date_maintenant@@ => date actuelle, au format jj/mm/aaaa
* @@date_heure_maintenant@@ => date + heure actuelle, au format jj/mm/aaaa HH:mm:ss
**/
$html = gamumail_remplacer_modele('date_maintenant', date('d/m/Y'), $html);
$html = gamumail_remplacer_modele('date_heure_maintenant', date('d/m/Y H:i:s'), $html);
return $html;
}

View file

@ -26,14 +26,14 @@
<h3><:gamumail:choix_slug:></h3>
<select id="choix_slug" name="choix_slug">
<option value=""[ (#ENV{slug}|non) selected]><:gamumail:choisissez_un_modele:></option>
<BOUCLE_slugs(GAMUMAILS){statut=publie}{par titre}{public!=non}>
<BOUCLE_slugs(GAMUMAILS){statut=publie}{par titre}{public!=non}{si #ENV{cacher_selecteur_slug}|non}>
<option value="#SLUG"[ (#SLUG|=={#ENV{slug}}|oui) selected]>#TITRE</option>
</BOUCLE_slugs>
</select>
</div>
</B_slugs>
<div class="bloc_slug" id="bloc_slug">
<INCLURE{fond=inclure/vue_slug, env, ajax=vue_slug}>
<INCLURE{fond=inclure/vue_slug,env,dest=#ENV{dest},ajax=vue_slug}>
</div>
<INCLURE{fond=gamumail/remplacements_slugs}>
</div>
@ -43,10 +43,8 @@
var choix_slug = $(this).val();
ajaxReload('vue_slug', {
args:{
slug : choix_slug,
dest : "#ENV{dest}"
slug : choix_slug
}
//, callback: function(){}
});
});
});

View file

@ -0,0 +1,28 @@
[(#REM) fichier vide appelé par formulaire/gamumail.html
surchargeable si besoin de jouer du JS en fonction du retour du traiter
par exemple pour fermer la modale dans laquelle formulaire/gamumail.html est ouvert
la fonction traiter de formulaire/gamumail.php ajoute le suffixe @@gamumail_ok au retour #ENV{message_ok} si l'envoi du gamumail s'est bien passé
Exemple de code pour tester le retour OK et ajouter du JS qui met à jour un bloc ajax paybyurl_#ID_TRANSACTION et ferme la modalbox
(ici le #ID_TRANSACTION est dans l'env du formulaire via l'#ARRAY{options} du charger )
[(#ENV{message_ok}|explode{@@}|table_valeur{1}|=={gamumail_ok}|oui)
<script type="text/javascript">
jQuery(function() {
var lien_ajax = 'paybyurl';
var id_transaction = #ENV{options/id_transaction};
ajaxReload(lien_ajax, {
args: {
id_transaction: id_transaction
},
callback: function(){
$.modalboxclose();
}
});
});
</script>
]
]

View file

@ -5,21 +5,21 @@
display: inline-block;
width: 100%;
}
.objet--mail {
.configuration_mails .objet--mail {
margin-top: 1.5rem;
}
.well {
.configuration_mails .well {
background-color: #cecece;
margin: 10px auto;
padding: 10px;
border-radius: 4px;
}
.un-pdf {
.configuration_mails .un-pdf {
border: 1px solid black;
margin-bottom: 1rem;
padding: 10px;
}
span.label {
.configuration_mails span.label {
display: inline-block;
width: 180px;
}
@ -27,20 +27,20 @@
background-color: #fff;
padding: .5rem;
}
.well h4.crayon {
.configuration_mails .well h4.crayon {
background-color: #cecece;
}
.wp600 {
.configuration_mails .wp600 {
width: 600px;
}
.btn_supprimer {
.configuration_mails .btn_supprimer {
float: right;
}
.btn_editer {
.configuration_mails .btn_editer {
float: right;
margin-right: 2rem;
}
.btn {
.configuration_mails .btn {
display: inline-block;
padding: 1rem 1.5rem;
cursor: pointer;
@ -57,34 +57,45 @@
font-size: inherit;
line-height: 1;
}
.markItUp .markItUpHeader ul a em {
.configuration_mails .markItUp .markItUpHeader ul a em {
width: 2rem;
height: 2rem;
}
span > em {
.configuration_mails span > em {
font-size: 85%;
}
.remplacements_slugs {
.configuration_mails .remplacements_slugs {
margin-top: 4rem;
}
.configuration_mails .name_config {
font-size: 1rem;
float: right;
}
</style>
<div class="inner configuration_mails">
[(#REM) <h1>Configuration des mails</h1> ]
<div class="configuration_generale">
<h2>Paramétres généraux</h2>
<div class="well">
<div class="une_conf">
<small class="name_config">gamumail/mail_cc</small>
<h4><:gamumail:email_en_cc:></h4>
<div class="#EDIT{meta-gamumail/mail_cc} inbl w600p">[(#CONFIG{gamumail/mail_cc}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div>
<p class="explication"><:gamumail:plusieurs_mails_separer_virgule:> <:gamumail:dbe_clic_editer:>.</p>
<div class="#EDIT{meta-gamumail/mail_cc} inbl w600p nomulti">[(#CONFIG{gamumail/mail_cc}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div>
<p class="explication"><:gamumail:plusieurs_mails_separer_virgule:>.</p>
</div>
</div>
<div class="well">
<div class="une_conf">
<small class="name_config">gamumail/mail_cci</small>
<h4><:gamumail:email_en_cci:></h4>
<div class="#EDIT{meta-gamumail/mail_cci} inbl w600p">[(#CONFIG{gamumail/mail_cci}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div>
<p class="explication"><:gamumail:plusieurs_mails_separer_virgule:> <:gamumail:dbe_clic_editer:>.</p>
</div>
<strong class="explication"><:gamumail:dbe_clic_editer_champs:></strong>
<div class="#EDIT{meta-gamumail/mail_cci} inbl w600p nomulti">[(#CONFIG{gamumail/mail_cci}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div>
<p class="explication"><:gamumail:plusieurs_mails_separer_virgule:>.</p>
</div>
<BOUCLE_message(GAMUMAILS)>
</div>
<h2>Modèles de mails</h2>
<h3 class="explication"><:gamumail:dbe_clic_editer_champs:></h3>
<BOUCLE_message(GAMUMAILS){par rang, num titre}>
<div class="well">
<div class="une_conf">
[(#AUTORISER{supprimer,gamumail}|oui)
@ -93,17 +104,17 @@
<span class="btn btn_editer" title="<:gamumail:editer_titre:>" onClick="$('#h4_#SLUG em.crayon-crayon').trigger('click');"><i class="fa fa-edit"></i></span>
<h4 class="toggle cursor #EDIT{titre}"
id="h4_#SLUG"
data-id="#SLUG">
data-id="#SLUG-#COMPTEUR_BOUCLE">
<i class="fa fa-envelope mrs"></i>
[(#TITRE)]
<i class="fa fa-caret-down"></i>
</h4>
<div id="#SLUG" class="js-hidden">
<div id="#SLUG-#COMPTEUR_BOUCLE" class="js-hidden">
<div class="objet--slug">
<strong><:gamumail:slug:>: </strong>
[(#AUTORISER{modifier_nom_slug, gamumail, #ID_GAMUMAIL}|?{
<span class="[(#EDIT{nom_slug})]">[(#SLUG|sinon{<:gamumail:dbe_clic_editer:>})]</span>
<span class="[(#EDIT{nom_slug})] nomulti">[(#SLUG|sinon{<:gamumail:dbe_clic_editer:>})]</span>
,
<span class="">[(#SLUG)]</span>
})]
@ -120,9 +131,21 @@
</div>
<div class="objet--mail">
<span><strong><:gamumail:documents_attaches:> :</strong> <em class="explication"><:gamumail:liste_id_separes:> , </em></span>
<div class="texte #EDIT{id_docs}">
<div class="texte #EDIT{id_docs} nomulti">
[(#ID_DOCS|sinon{<:gamumail:dbe_clic_editer:>})]
</div>
<B_docs_spip>
<div class="details_docs_spip">
<ul>
<BOUCLE_docs_spip(DOCUMENTS){id_document IN #ID_DOCS|explode{','}}{tous}>
<li><strong>#ID_DOCUMENT :</strong> #TITRE
([<a class="mediabox" href="#URL_DOCUMENT" title="Voir le document">(#FICHIER|basename)</a>)]
[ / <a href="(#URL_ECRIRE{document_edit}|parametre_url{id_document,#ID_DOCUMENT})"><i class="fa fa-edit"></i> Gérer le document</a>]
</li>
</BOUCLE_docs_spip>
</ul>
</div>
</B_docs_spip>
</div>
<div class="objet--mail">
<span><strong><:gamumail:visibilite_public:>:</strong> <em class="explication"><:gamumail:explication_mail_auto_uniquement:></em></span>

View file

@ -0,0 +1,48 @@
<style type="text/css" media="screen">
.fichier .description {
display: flex;
flex-direction: row;
/* margin-bottom: 6px; */
}
.fichier .description:hover {
background-color:rgba(177, 187, 196,0.5);
}
.fichier .previsualisation {
margin: 5px;
}
.html_titre {
display: none!important;
}
</style>
[(#REM)
surcharge du fichier de bigform :
- inclure/inc-bigup_liste_fichiers.html
]
<B_fichiers>
<div class='bigup_fichiers fichiers_[(#ENV{nom}|concat{#ENV{multiple}|=={oui}|?{\[\]}}|bigup_nom2classe)]'>
<BOUCLE_fichiers(DATA){source tableau, #FICHIERS|bigup_lister_fichiers{#ENV{nom},#ENV{multiple}}}>
<div class='fichier'>
<div class="description">
[(#VALEUR{bigup/vignette/data}|oui)
<div class="previsualisation #VALEUR{bigup/extension}" title="[(#NAME|attribut_html)] ([(#SIZE|taille_en_octets)])">
<span style="background-image:url([(#VALEUR{bigup/vignette/data})]);"></span>
</div>]
[(#VALEUR{bigup/vignette/data}|non)
<div class="vignette_extension #VALEUR{bigup/extension}" title="[(#TYPE|attribut_html)]"><span></span></div>]
<div class='infos'>
<span class='name'><strong>#NAME</strong></span>
<span class='size'>[(#SIZE|taille_en_octets)]</span>
</div>
<div class='actions'>
<button class='btn' type='submit'
name='bigup_enlever_fichier' value="#VALEUR{bigup/identifiant}"
onclick="jQuery(this).parents('form').find('input,textarea,select').filter('[required]').prop('required', false); return true;">
<:bigup:bouton_enlever:>
</button>
</div>
</div>
</div>
</BOUCLE_fichiers>
</div>
</B_fichiers>

View file

@ -1,11 +1,17 @@
[(#SET{Tpdf,#ARRAY{
fichier,#ENV{pdf_fichier},
nom,#ENV{pdf_nom},
contexte,#ARRAY{slug, #ENV{slug}}
}}
)]
<h3 id="titre_slug"><:gamumail:contenu_mail:></h3>
<div class="bloc_contenu_slug ajax">
[(#FORMULAIRE_GAMUMAIL{
#ENV{slug},
#ENV{dest},
#ENV{client},
#ENV{Tpdf},
#GET{Tpdf},
#ENV{redirect},
#ARRAY{}
#ENV{options}
})]
</div>

15
js/toClip.js Normal file
View file

@ -0,0 +1,15 @@
jQuery(function ($) {
$('.toClip').on('mousedown', function (e) {
e.preventDefault();
const t = $(this).data('clipboard-text') ?? $(this).text();
navigator.clipboard.writeText(t).then(() => {
barre_inserer(t);
const html = `<span class="copierOk verte"><strong>&#x2714; copié</strong></span>`;
$(this).append(html);
setTimeout(() => {
$(this).children('.copierOk').remove();
}, 1000);
});
});
});

112
lang/gamumail_en.php Normal file
View file

@ -0,0 +1,112 @@
<?php
// This is a SPIP language file -- Ceci est un fichier langue de SPIP
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
$GLOBALS[$GLOBALS['idx_lang']] = array(
// A
'ajouter_lien_gamumail' => 'Ajouter ce gamumail',
'avertissement_remplacements' => 'NB: attention! tous les autres remplacements sont spécifiques de leur modèle et ne peuvent êtres utilisés dans un autre modèle',
'autres_fichiers_attaches' => 'Autres Fichiers attachés',
// C
'champ_slug_label' => 'Slug',
'champ_sujet_label' => 'Sujet',
'champ_texte_label' => 'Texte',
'confirmer_supprimer_gamumail' => 'Confirmez-vous la suppression de cet gamumail ?',
'choix_slug' => 'Choix du modèle',
'contenu_mail' => 'Contenu du mail',
'creer_modele' => 'Créer un modèle de mail',
'corps_message' => 'Text',
// D
'documents_attaches' => 'Documents attachés',
'dbe_clic_editer' => 'Double clic pour éditer',
'dbe_clic_editer_champs' => 'Double clic pour éditer les champs des modèles.',
'date_maintenant' => 'Current date (in dd/mm/yyyy format)',
'date_heure_maintenant' => 'Date + current time (in dd/mm/yyyy HH:mm:ss format)',
//EE
'envoyer' => 'Envoyer',
"erreur_envoi_mail" => "Erreur dans l'envoi de votre mail",
'erreur_format_slug' => 'Le slug est un identifiant qui ne peut contenir que des chiffres, lettres et _ ou -',
'email_en_cc' => 'Emails en copie "cc" des différents messages',
'email_en_cci' => 'Emails en copie cachée "cci" des différents messages',
'editer_titre' => 'Editer le titre',
'explication_mail_auto_uniquement' => 'permet de ne pas afficher les modèles utilisés uniquement en envoi automatique',
// F
'fichiers_annexes' => 'Fichiers annexes',
// I
'icone_creer_gamumail' => 'Créer un gamumail',
'icone_modifier_gamumail' => 'Modifier ce gamumail',
'info_1_gamumail' => 'Un gamumail',
'info_aucun_gamumail' => 'Aucun gamumail',
'info_gamumails_auteur' => 'Les gamumails de cet auteur',
'info_nb_gamumails' => '@nb@ gamumails',
'id_destinataires_sans_mails' => 'Les id_auteur @ids_erreur@ n\'ont pas d\'adresse mail',
'id_docs_attaches' => 'ID documents séparés par une virgule',
'id_docs_en_erreur' => 'Documents en erreur : @id_docs_erreurs@',
// L
'liste_id_separes' => 'liste d\'id_document séparés par une virgule',
//MM
"mail_envoye" => "Votre message a bien été envoyé",
'mails_destinataires_en_erreur' => 'Les destinataires @mails_erreur@ ne sont pas des adresses mails valides',
'message' => 'Message',
'modele_visible' => 'Modèle disponible',
'modele_non_visible' => 'Modèle non disponible',
'modele_masquer' => 'Masquer le modèle',
'modele_afficher' => 'Afficher le modèle',
// N
'nom' => 'Prénom Nom du destinataire (ou Nom si pas de champ "prenom")',
// O
'objet' => 'Objet',
// P
'pas_de_slug' => 'Pas de slug avec cet identifiant',
'plusieurs_mails_separer_virgule' => 'Si plusieurs emails, les séparer par une virgule.',
'pdf_envoyes' => 'Fichiers PDF générés',
'prenom_sinon_nom' => 'Prénom du destinataire (ou Nom si pas de champ "prenom")',
// R
'retirer_lien_gamumail' => 'Retirer ce gamumail',
'retirer_tous_liens_gamumails' => 'Retirer tous les gamumails',
'remplacements_disponibles' => 'Remplacements automatiques disponibles :',
// S
'supprimer_gamumail' => 'Supprimer cet gamumail',
'selectionnez_modele' => 'Sélectionnez un modèle...',
'supprimer_modele' => 'Supprimer le modèle',
'slug' => 'Slug',
'sujet' => 'Subject',
'switch_modele_public' => 'Modifier la visibilité publique du modèle',
// T
'texte_ajouter_gamumail' => 'Ajouter un gamumail',
'texte_changer_statut_gamumail' => 'Ce gamumail est :',
'texte_creer_associer_gamumail' => 'Créer et associer un gamumail',
'texte_definir_comme_traduction_gamumail' => 'Ce gamumail est une traduction du gamumail numéro :',
'titre_gamumail' => 'Gamumail',
'titre_gamumails' => 'Gamumails',
'titre_gamumails_rubrique' => 'Gamumails de la rubrique',
'titre_langue_gamumail' => 'Langue de ce gamumail',
'titre_logo_gamumail' => 'Logo de ce gamumail',
'titre_objets_lies_gamumail' => 'Liés à ce gamumail',
// U
'url_site' => 'URL du site',
'url_raz_passe' => 'URL de la page de récupération de mot de passe',
'url_spip_pass' => 'URL of the link to reset the account password <small>(only to be used in the password reset slug!)</small>',
// V
'visibilite_public' => 'Disponible dans la liste des modèles',
);

View file

@ -21,11 +21,14 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'choix_slug' => 'Choix du modèle',
'contenu_mail' => 'Contenu du mail',
'creer_modele' => 'Créer un modèle de mail',
'corps_message' => 'Texte',
// D
'documents_attaches' => 'Documents attachés',
'dbe_clic_editer' => 'Double clic pour éditer',
'dbe_clic_editer_champs' => 'Double clic pour éditer les champs des modèles.',
'date_maintenant' => 'Date actuelle (au format jj/mm/aaaa)',
'date_heure_maintenant' => 'Date + heure actuelle (au format jj/mm/aaaa HH:mm:ss)',
//EE
'envoyer' => 'Envoyer',
@ -37,7 +40,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'explication_mail_auto_uniquement' => 'permet de ne pas afficher les modèles utilisés uniquement en envoi automatique',
// F
'pdf_envoyes' => 'Fichiers PDF envoyés',
'fichiers_annexes' => 'Fichiers annexes',
'fichiers_televerser' => 'Fichiers téléversés',
// I
'icone_creer_gamumail' => 'Créer un gamumail',
@ -71,6 +75,8 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// P
'pas_de_slug' => 'Pas de slug avec cet identifiant',
'plusieurs_mails_separer_virgule' => 'Si plusieurs emails, les séparer par une virgule.',
'pdf_envoyes' => 'Fichiers PDF générés',
'prenom_sinon_nom' => 'Prénom du destinataire (ou Nom si pas de champ "prenom")',
// R
'retirer_lien_gamumail' => 'Retirer ce gamumail',
@ -82,6 +88,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'selectionnez_modele' => 'Sélectionnez un modèle...',
'supprimer_modele' => 'Supprimer le modèle',
'slug' => 'Slug',
'sujet' => 'Sujet',
'switch_modele_public' => 'Modifier la visibilité publique du modèle',
// T
@ -99,6 +106,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// U
'url_site' => 'URL du site',
'url_raz_passe' => 'URL de la page de récupération de mot de passe',
'url_spip_pass' => 'URL du lien pour réinitialiser le mot de passe du compte <small>(à n\'utiliser que dans le slug de reset de passe !)</small>',
// V
'visibilite_public' => 'Disponible dans la liste des modèles',

View file

@ -1,12 +1,12 @@
<paquet
prefix="gamumail"
categorie="communication"
version="1.0.18"
version="1.4.6"
etat="dev"
compatibilite="[3.2.0;4.0.*]"
compatibilite="[3.2.0;4.*]"
logo="prive/themes/spip/images/gamumail-64.png"
documentation=""
schema="1.0.14"
schema="1.0.17"
>
<nom>GamuMail</nom>
@ -15,11 +15,15 @@
<licence>GNU/GPL</licence>
<necessite nom="bigform" compatibilite="[1.0.0;[" />
<necessite nom="bigform" compatibilite="[1.2.3;[" />
<necessite nom="crayons" compatibilite="[2.0.10;[" />
<necessite nom="facteur" compatibilite="[4.0.0;[" />
<necessite nom="gamufonctions" compatibilite="[1.3.4;[" />
<pipeline nom="remplacements_slug" action='' />
<pipeline nom="post_gamumail_ok" action='' />
<pipeline nom="tpdf_charger_contexte" action='' />
<pipeline nom="gamumail_filtrer_tPDF" action='' />
<pipeline nom="autoriser" inclure="gamumail_autorisations.php" />