Compare commits

..

204 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
cy_altern
9243f5c27c ajout des pièces attachées en fichiers PDF générés par SPIPDF avec passage de contexte pour contenu dynamique. Par rapport à la version de Roc, ajoute la possibilité d'avoir plusieurs fichiers dynamiques avec chacun son fichier de base et/ou son contexte. Tout est documenté dans le README 2021-05-29 18:53:31 +02:00
c72d52867f On peut ajouter une tableau de pieces_jointes :
$options['pieces_jointes'][] = [
    'chemin'   => 'tmp/cache/toto.xls',
    'nom'      => 'toto.xls',
    'encodage' => 'base64',
    'mime'     => 'application/vnd.ms-excel'
]
2021-05-25 09:23:53 +02:00
01655c03e0 un include manquant 2021-05-05 17:10:30 +02:00
bd99a25c85 Merge branch 'master' of https://git.gamuza.fr/spip/gamumail 2021-05-02 22:31:47 +02:00
8bdbf5a164 comp spip 4.0 2021-05-02 22:31:42 +02:00
cy_altern
12e40495d4 utiliser generer_url_public pour les URL pages 2021-04-26 19:55:44 +02:00
c3896341fd deplace dans optinos 2021-04-26 12:24:51 +02:00
95b1941801 correction creation de slug 2021-04-26 11:35:55 +02:00
2e60b096f6 maj fonction creation d'un slug 2021-04-26 10:56:42 +02:00
bc4922f87d par defaut, si appel de la fonction -> editable = non 2021-04-26 09:47:03 +02:00
cy_altern
ec5dcd9fe8 amélioration du système de remplacements @@truc_a_remplacer@@ pour permettre à Gamumail de fournir des remplacement génériques (via inc/gamumail_remplacements.php). Passage de la doc intégrée des remplacements via ['remplacements_gamumail'] pour permettre à chaque plugin de fournir la doc de ses remplacements 2021-04-25 21:44:48 +02:00
cy_altern
17ba9f097a correction du calcul d'autorisation pour l'édition du nom des slugs 2021-04-25 14:20:47 +02:00
cy_altern
44bc7bdc5b ajustements pour la création auto d'un slug à l'installation d'un plugin 2021-04-24 01:46:05 +02:00
cy_altern
26a5b2252b sélecteur plus spécifique pour le background des crayons 2021-04-23 15:04:13 +02:00
ebd12aa1e8 la fonction creer_slug peut fonctionner par un appel via charger_fonction() 2021-04-23 14:44:02 +02:00
c576301511 ajout champ editable du slug, par defaut = oui 2021-04-23 14:36:09 +02:00
3a8356e81b ajout fonction : gamumail_remplacer_modele() 2021-04-13 18:06:00 +02:00
000ffb8478 maj doc 2021-04-13 16:14:35 +02:00
3237059720 il existait une page de conf de gamumail, on la garde mais on change l'autorisation 2021-04-13 16:12:30 +02:00
d729f807e6 utiliser autoriser(webmestre) 2021-04-13 15:59:18 +02:00
2a99d36d52 Merge branch 'master' of https://git.gamuza.fr/spip/gamumail 2021-04-13 15:58:42 +02:00
104d18297f ajoute la page configurer_gamumail, avec autorisation webmestre par defaut' 2021-04-13 15:54:27 +02:00
80865db892 pas de cron 2021-04-08 15:03:06 +02:00
cy_altern
17b1fec421 correction de count() pas sur des arrays + un var_dump de debog qui trainait 2021-04-01 00:46:59 +02:00
cy_altern
1440d1ed1e débogage en cours pour l'attachement des id_document 2021-03-09 01:24:43 +01:00
cy_altern
b220ddc30a ajout des documents attachés récupérés via un éventuel inclure gamumail/#SLUG_fichiers.html . Maj de la doc 2021-03-09 01:04:30 +01:00
cy_altern
300eb97642 css et chaine de langue 2021-03-08 20:59:12 +01:00
cy_altern
c986429568 autorisation de modifier le nom du slug = réservé aux admins @gamuza.fr. 2021-03-08 18:59:52 +01:00
cy_altern
2abc097a57 pas de doublon de fonction... 2021-03-07 19:20:47 +01:00
cy_altern
a229980fbd Merge branch 'master' of ssh://git.gamuza.fr:2222/spip/gamumail 2021-03-07 19:16:28 +01:00
cy_altern
c424f461cc broutilles pour compatibilité Roc 2021-03-07 19:16:14 +01:00
cy_altern
cf20da0950 up de z 2021-01-14 22:33:50 +01:00
cy_altern
219c1ef56d menage 2021-01-14 22:31:30 +01:00
cy_altern
a978584a2f grand luxe : le PDF personnalisé est téléchargeable pour visualisation via un lien dans le form 2021-01-14 22:29:08 +01:00
cy_altern
c464fcae54 comme d'hab' ne pas laisser trainer de var_dump() 2021-01-14 21:44:42 +01:00
cy_altern
4240e86452 correction à tester/valider : on peut passer les paramètres de l'url du PDF en string systématiquement 2021-01-14 21:40:43 +01:00
clem
70ef56ad29 utilisation de la constante _DEBUG_AUTORISER (tirée de dd) pour que le curl de la gesénération des pdf ne bloque pas avec les certificats auto-signés 2020-12-02 01:52:30 +01:00
clem
8e8cfc379a le howto pour outrepasser les erreurs de certificat auto-signé lors de devs en https local 2020-12-01 23:11:14 +01:00
clem
22e0c42ef2 controleur + vue pour les crayons du slug histoire de contraindre le format en JS 2020-09-28 02:09:36 +02:00
clem
0feb7ecfee mise au carré des autorisations 2020-09-28 00:46:48 +02:00
clem
6221819062 ajout de la configuration de masquage/affichage des slugs pour le form public 2020-09-27 18:15:20 +02:00
clem
7f4ed3a6a9 ajout du champ public pour gérer l'affichage ou non d'un slug dans le form d'envoi public. Toutes les cvhaînes de langue de la page de config des slugs 2020-09-26 19:36:46 +02:00
clem
06286f7ea6 la doc pôur l'utilisation des PDFs et le passage d'args à l'API envoyer_gamumail 2020-09-14 17:05:31 +02:00
clem
4a1a932503 ajout des PDFs générés avec passage de paramètres dans les pièces jointes de l'envoi de gamumails via API 2020-09-14 15:39:53 +02:00
clem
678070dbc0 réorganisation du passage des PDF aux slugs pour essayer d'unifier formulaire et API 2020-09-13 03:54:53 +02:00
clem
cb96f9f1b1 passage dans l'array des PDFs générés à attacher au mail 2020-09-12 23:09:49 +02:00
147bc80a76 on test pour ne pas creer plusieurs comptes auteurs : curl_login 2020-08-31 11:44:55 +02:00
clem
b772c4ca1c version 1.0.12 pour rattrapage de la création de curl_login. 2020-08-31 11:39:23 +02:00
1a2096ba80 dans le create, il faut tout 2020-08-31 11:28:42 +02:00
clem
842daa7e6a maj de la capture de l'interface de gestion des slugs 2020-08-30 19:18:40 +02:00
clem
4afe426190 maj de la capture de l'interface de gestion des slugs 2020-08-30 19:15:35 +02:00
clem
04c6f0824a documentation 2020-08-30 19:06:52 +02:00
clem
28b5df40ce rechargement ajax du clug dans l'interface d'envoi de mails 2020-08-30 18:09:44 +02:00
clem
100f90923b début de l'interface d'envoi de gamumail 2020-08-26 16:58:33 +02:00
clem
cfa22caf62 passage en pipeline du traitement des @@ spécifiques d'un plugin 2020-08-26 14:15:54 +02:00
clem
15b011259e correction de la fonction de filtre qui doit être anonyme. Ajout des [] dans les infos de dbog 2020-08-26 00:00:04 +02:00
clem
383b4f9395 oups! ne pas oublier de tout mettre en chaîne de langue... 2020-08-25 19:41:23 +02:00
clem
8b7f9486c7 Ajout d'un bloc pour lister les remplacements disponibles des @@ des slugs (à surcharger par site). 2020-08-25 19:18:33 +02:00
clem
d134193c68 ajout d'un squelette de test de slug: ?page=test_slug&slug=le_modele&dest=123 2020-08-22 18:44:34 +02:00
clem
6c2ab5c054 tant qu'on y est de faire la version grand luxe de GamuMail, ajout d'une saisie selecteur_slug 2020-08-21 13:05:07 +02:00
clem
617df6ea97 le passage en cci en cas de destinataires multiple dépend de l' ['cci'=>true]. Plus de confort pour le paramètre : on accepte un array ou une string avec , (et toujours id_auteurs en mix avec adresses mail) 2020-08-21 11:33:49 +02:00
clem
f0221e8221 fonction envoyer_gamumail OK (y compris docs attachés). Intégration des en tant que mix id_auteurs et mails séparés par des virgules dans le CVT gamumail. 2020-08-21 02:01:15 +02:00
clem
28e73628ae appel des squelettes de header et footer : priorité au squelettes spécifiques du slug si ils existent (le générique de gamumail reste en par défaut) 2020-08-20 11:35:35 +02:00
clem
728d5dcf6d premier jet pour la fonction inc/envoyer_gamumail qui envoie un mail à partir d'un slug. Ajout du champ id_docs aux slugs. Ajout d'un header et d'un footer standard pour les (inutiles) mails HTML 2020-08-19 20:10:12 +02:00
clem
7a78d7b4d5 ajout des exemples de fonctions appelées par le CVT de gamumail.php 2020-08-19 14:45:37 +02:00
clem
08ab9ee4aa micro-explication 2020-08-19 12:57:19 +02:00
clem
f56ddbc85e passage en bouton action de la création d'un slug. Ajout d'une action suppression + bouton édition du titre (trigger sur le crayon) 2020-08-19 12:53:34 +02:00
clem
ec2c6b29e1 Merge branch 'master' of ssh://git.gamuza.fr:2222/spip/gamumail 2020-08-19 01:30:42 +02:00
clem
01cdfba81a un début de form de création de slug 2020-08-19 01:30:29 +02:00
e52663de9b compat spip 32 2020-07-16 15:44:05 +02:00
clem
9c50fa47aa suite de la modif 2020-07-04 01:51:02 +02:00
clem
176f6d5127 message plus explicite pour l'édition avec les crayons 2020-07-04 01:47:52 +02:00
37 changed files with 2373 additions and 412 deletions

336
README.md
View file

@ -1,33 +1,41 @@
# gamuMail # gamuMail
> P.O.C pour généraliser un formulaire d'envoi de message
> formulaire d'envoi de messages configurables
## Il gere nativement : ## Il gere nativement :
* Pour
* Cc en meta : **gamumail/mail_cc** - Pour
* Cci en en meta : **gamumail/mail_cci** - Cc en meta : **gamumail/mail_cc**
* Sujet - Cci en en meta : **gamumail/mail_cci**
* Texte - Cci en globals []: `$GLOBALS['gamuza_mail_cci'] = ['sarl.gamuza@gmail.com'];`
* Les documents attachés au modèle (cf ci-dessous) - Sujet
* une liste de pdf (il faut le plugin spipdf) - Texte
![interface](doc/interface.png "interface") - 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 : ## Il gere des modèles de contenu pour :
* Sujet
* Texte - Sujet
- Texte
- ID documents joints (spip_documents)
--- ---
* Chaque modèle à un identifiant textuel : **slug** qui doit etre unique. Il ne peut etre creer / modifié QUE par les webmestres - 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 inclure dans une page : - Pour gerer ses modèles, il faut se rendre sur la page : `?page=configuration_mails`
```html ![configuration](doc/configuration.png "Exemple de configuration")
<INCLURE{fond=inclure/gamumail_config,env}>
```
![configuration](doc/configuration.png "Exemple de configuration")
## Personnalisation du formulaire d'envoi ## Personnalisation du formulaire d'envoi
### Dans le html ### 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
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** > **/!\ Le name doit etre Tid_doc**
> >
ex de fichier : > ex de fichier :
```html ```html
<B_doc> <B_doc>
<h2>Fichiers attachés au séjour</h2> <h2>Fichiers attachés au séjour</h2>
@ -36,68 +44,167 @@ ex de fichier :
<BOUCLE_doc(DOCUMENTS){id_article=#ENV{options/id_article}}{extension=pdf}> <BOUCLE_doc(DOCUMENTS){id_article=#ENV{options/id_article}}{extension=pdf}>
<div class="choix"> <div class="choix">
<input type="checkbox" class="checkbox" name="Tid_doc[]" value="#ID_DOCUMENT" id="Tid_doc_#ID_DOCUMENT" checked="checked" > <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> </div>
</BOUCLE_doc> </BOUCLE_doc>
</div> </div>
</div> </div>
</B_doc> </B_doc>
``` ```
3 branchements possibles : 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_debutform.html -> au début du form
* gamumail/SLUG_fichier.html -> à la fin du formulaire - 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)
- 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)]
<BOUCLE_dest(AUTEURS){id_auteur=#ENV{dest}}{tout}>
<div class="inner">
<div class="ajax mbl">
<h1>Envoyer un mail à [(#PRENOM|ucfirst) ][(#NOM|ucfirst)]</h1>
<INCLURE{fond=inclure/envoyer_gamumail, env, id_destinataire=#ID_AUTEUR}>
</div>
</div>
</BOUCLE_dest>
```
### Dans le php ### Dans le php
#### 1. Appel du formualire
#### 1. Appel du formulaire
> Args du formulaire : > Args du formulaire :
>
```php ```php
/** /**
* formulaire générique pour envoyer des mails avec pieces attachés * formulaire générique pour envoyer des mails avec pieces attachés
* *
* @param string $slug modele du mail a charger * @param string $slug modele du mail a charger
* @param int|string $auteur id_auteur ou email du destinataire * @param string $destinataires = adresses mails et id_auteurs séparées par , ou en array
* @param array $Tclient []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] * 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
* ou * @param array $Tclient = un ou plusieurs mails de destinataires sortis d'une table objet spécifique
* ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] * de la forme []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email']
* @param array $Tpdf []['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] * @param array $Tpdf = un ou plusieurs fichiers PDF générés par spiPDF (le contexte permet la personnalisation du contenu)
* ou * []['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]]
* @param string $redirect * @param string $redirect
* @param array $options * @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
*
* @return array $valeurs * @return array $valeurs
*/ */
function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){ function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){
} }
``` ```
> l'Argument $Tclient est utilisé pour récupérer des emails dans un ou X autres Objets SPIP
#### 2. modification de chaque étape: charger / vérifier / traiter #### 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} } })]
```
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} } })]
```
/!\ en cas de plusieurs PDF :
- 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. surcharges de chaque étape: charger / vérifier / traiter
Pour chaque étape, on peut modifier l'Array de sortie : Pour chaque étape, on peut modifier l'Array de sortie :
* charger -> $valeurs
* verifier -> $erreurs
* traiter -> $corps (array du message envoyé à facteur)
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): - charger -> $valeurs
* pour charger : **gamumail/charger.php** pour tous les formulaires ou - verifier -> $erreurs
* pour charger : **gamumail/SLUG_charger.php** avec une fonction : - 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)
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 ```php
function gamumail_SLUG_charger($valeurs, $options = []){ function gamumail_NOM_SLUG_charger($valeurs, $options = []){
return $valeurs; 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 ```php
function gamumail_SLUG_verifier($erreurs, $options = []){ function gamumail_NOM_SLUG_verifier($erreurs, $options = []){
return $erreurs; return $erreurs;
} }
``` ```
* pour traiter : **gamumail/traiter.php** pour tous les formulaires ou
* 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 ```php
function gamumail_contrat_resa_traiter($corps, $options = []){ function gamumail_NOM_SLUG_traiter($corps, $options = []){
if (array_key_exists('id_article', $options)) { if (array_key_exists('id_article', $options)) {
$htmlAdd = ''; $htmlAdd = '';
$texteAdd = ''; $texteAdd = '';
@ -118,10 +225,131 @@ function gamumail_contrat_resa_traiter($corps, $options = []){
} }
``` ```
#### 3. Ajouter un header / footer dans notre content html #### 3. Pipeline remplacements_slug pour le traitement du contenu des messages
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
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
* $flux['args']['slug'] = $slug
* $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. 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,
'options' => ['nb_parts' => intval(_request('nombre'))],
'pdfs' => [
[
'fichier' => 'pdf_attestation_souscription',
'nom' => 'attestation_souscription_'.$id_souscription,
'contexte' => ['id_souscription' => $id_souscription]
],
],
];
$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
* 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 $options :
* $options['debug' => true] pour afficher le $corps final sans envoyer le mail
* $options['cci' => true] pour passer tous les destinataires en cci si il y en a plus qu'un
* $options['args' => ['param_1' => 'valeur_1, 'param_2' => 'valeur_2', ...]]
* $options['pdfs' => [...]] 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',
* 'contexte' => ['parametre_url_1' => 'valeur_1', 'parametre_url_2' => 'valeur_2', ...]
* '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_ :
```php
// 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);
}
```

75
action/creer_slug.php Normal file
View file

@ -0,0 +1,75 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
defined('_GAMUMAIL_PREFIX_SLUG') || define('_GAMUMAIL_PREFIX_SLUG', "slug");
/**
* créer un slug Gamumail
*
* @plugin GamuMail
*
* @copyright 2020
* @author cy_altern
* @licence GNU/GPL
*
**/
function action_creer_slug_dist($slug = null, $opt = [], $ecraser = false){
include_spip('inc/autoriser');
include_spip('action/editer_objet');
if (!autoriser('creer','gamumail')) {
return false;
}
// Arrive d'une action SPIP
if ($slug === null) {
$set = [
'slug' => '',
'titre' => 'Le titre du modèle',
'sujet' => 'Le sujet du mail',
'texte' => 'Le texte du mail',
'statut' => 'publie',
'editable' => '',
];
if ($id_slug = objet_inserer('gamumail', null, $set)) {
$slug = getSlugGamumail($id_slug);
$set = ['slug' => $slug];
sql_updateq('spip_gamumails', $set, 'id_gamumail = '.$id_slug);
}
} else {
// Appel de la fonction via charger_fonction("creer_slug", 'action');
// Création d'un slug à l'installation d'un plugin
// remplacement d'un slug, il faut l'option $ecraser=true
$id_slug = sql_getfetsel('id_gamumail', 'spip_gamumails', 'slug='.sql_quote($slug));
if (
intval($id_slug)
and $ecraser
) {
sql_updateq('spip_gamumails', $opt, 'id_gamumail='.intval($id_slug));
}
// creation d'un nouveau slug
if (!intval($id_slug)) {
$opt['slug'] = $slug;
sql_insertq('spip_gamumails', $opt);
}
}
// Cache
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

@ -6,17 +6,13 @@ function action_gamuform_add_pdf_dist(){
return false; return false;
include_spip('inc/autoriser'); include_spip('inc/autoriser');
if (! autoriser("etre","connecte")) { if (!autoriser('modifier','gamumail')) {
return false; return false;
} }
$securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action(); $arg = $securiser_action();
$id_gamumail = $arg; $id_gamumail = $arg;
include_spip('inc/autoriser');
if (! autoriser("webmestre")) {
return false;
}
if (intval($id_gamumail)) { if (intval($id_gamumail)) {
sql_insertq('spip_gamumail_pdfs',['id_gamumail' => intval($id_gamumail)]); sql_insertq('spip_gamumail_pdfs',['id_gamumail' => intval($id_gamumail)]);

33
action/supprimer_slug.php Normal file
View file

@ -0,0 +1,33 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* supprimer un slug Gamumail
*
* @plugin GamuMail
*
* @copyright 2020
* @author cy_altern
* @licence GNU/GPL
*
**/
include_spip('inc/autoriser');
function action_supprimer_slug_dist(){
include_spip('inc/autoriser');
if (!autoriser('supprimer','gamumail')) {
return false;
}
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$id_gamumail = intval($arg);
if ($id_gamumail) {
sql_delete('spip_gamumails','id_gamumail ='.$id_gamumail);
}
// Cache
include_spip('inc/invalideur');
suivre_invalideur("id='id_gamumail/$id_gamumail'");
}

View file

@ -0,0 +1,35 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* modifier la visibilité publique d'un slug Gamumail
*
* @plugin GamuMail
*
* @copyright 2020
* @author cy_altern
* @licence GNU/GPL
*
**/
include_spip('inc/autoriser');
function action_switcher_slug_public_dist(){
include_spip('inc/autoriser');
if (!autoriser('modifier','gamumail')) {
return false;
}
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
$id_gamumail = intval($arg);
if ($id_gamumail) {
$public = sql_getfetsel('public', 'spip_gamumails', 'id_gamumail ='.$id_gamumail);
$set = $public == 'oui' ? ['public' => "non"] : ['public' => "oui"];
sql_updateq('spip_gamumails', $set, 'id_gamumail ='.$id_gamumail);
}
// Cache
include_spip('inc/invalideur');
suivre_invalideur("id='id_gamumail/$id_gamumail'");
}

View file

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

View file

@ -0,0 +1,9 @@
#CACHE{0}
[(#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>

11
content/test_slug.html Normal file
View file

@ -0,0 +1,11 @@
[(#AUTORISER{webmestre}|sinon_interdire_acces)]
[(#REM)
squelette pour tester un slug
@paramètres :
#ENV{slug} = nom du slug
#ENV{dest} = string|array destinataire(s)
@return : le résultat de la fonction envoyer_gamumail() en mode debug
]
[(#ENV{slug}|tester_slug{#ENV{dest}, #ARRAY{id_dossier,#ENV{id_dossier}}})]

View file

@ -0,0 +1,20 @@
#CACHE{0}
<BOUCLE_toto(GAMUMAILS){id_gamumail}>
<fieldset>
<div>
<label for="slug">Identifiant du modèle (slug)<br><small>chiffres, lettres, _ (pas d'espaces)</small> </label>
<input type="text" value="#SLUG" name="#ENV{name_slug}" id="slug" required pattern="[a-zA-Z0-9_]{6,40}" />
</div>
</fieldset>
</BOUCLE_toto>
<script type="text/javascript">
jQuery(function() {
$('#slug').on('keyup', function() {
var reg = new RegExp('[^a-zA-Z0-9_]', 'g');
var rep = $(this).val().replace(reg, '');
$(this).val(rep);
});
});
</script>
</B_toto>

View file

@ -1,4 +1,4 @@
/* surrounding tag container */ /* les styles de tag-editor */
.tag-editor { .tag-editor {
list-style-type: none; list-style-type: none;
padding: 0 5px 0 0; padding: 0 5px 0 0;
@ -20,14 +20,17 @@
overflow: hidden; overflow: hidden;
margin: 3px 0; margin: 3px 0;
} }
.tag-editor div { .tag-editor div {
float: left; float: left;
padding: 0 4px; padding: 0 4px;
} }
.tag-editor .placeholder { .tag-editor .placeholder {
padding: 0 8px; padding: 0 8px;
color: #bbb; color: #bbb;
} }
.tag-editor .tag-editor-spacer { .tag-editor .tag-editor-spacer {
padding: 0; padding: 0;
width: 8px; width: 8px;
@ -35,6 +38,7 @@
color: transparent; color: transparent;
background: none; background: none;
} }
.tag-editor input { .tag-editor input {
vertical-align: inherit; vertical-align: inherit;
border: 0; border: 0;
@ -50,11 +54,13 @@
background: none; background: none;
color: #444; color: #444;
} }
/* hide original input field or textarea visually to allow tab navigation */ /* hide original input field or textarea visually to allow tab navigation */
.tag-editor-hidden-src { .tag-editor-hidden-src {
position: absolute !important; position: absolute !important;
left: -99999px; left: -99999px;
} }
/* hide IE10 "clear field" X */ /* hide IE10 "clear field" X */
.tag-editor ::-ms-clear { .tag-editor ::-ms-clear {
display: none; display: none;
@ -82,10 +88,12 @@
padding-left: 3px; padding-left: 3px;
padding-right: 4px; padding-right: 4px;
} }
.tag-editor .tag-editor-delete i { .tag-editor .tag-editor-delete i {
line-height: 18px; line-height: 18px;
display: inline-block; 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; color: #8ba7ba; content: "×"; font-style: normal; }*/
.tag-editor .tag-editor-delete i:before { .tag-editor .tag-editor-delete i:before {
font-size: 16px; font-size: 16px;
@ -93,11 +101,13 @@
content: '×'; content: '×';
font-style: normal; font-style: normal;
} }
.tag-editor .tag-editor-delete:hover i:before { .tag-editor .tag-editor-delete:hover i:before {
color: #d65454; color: #d65454;
} }
.tag-editor .tag-editor-tag.active + .tag-editor-delete,
.tag-editor .tag-editor-tag.active + .tag-editor-delete i { .tag-editor .tag-editor-tag.active+.tag-editor-delete,
.tag-editor .tag-editor-tag.active+.tag-editor-delete i {
visibility: hidden; visibility: hidden;
cursor: text; cursor: text;
} }
@ -114,9 +124,11 @@
cursor: default; cursor: default;
font-size: 14px; font-size: 14px;
} }
.ui-front { .ui-front {
z-index: 9999; z-index: 9999;
} }
.ui-menu { .ui-menu {
list-style: none; list-style: none;
padding: 1px; padding: 1px;
@ -124,21 +136,26 @@
display: block; display: block;
outline: none; outline: none;
} }
.ui-menu .ui-menu-item a { .ui-menu .ui-menu-item a {
text-decoration: none; text-decoration: none;
display: block; display: block;
padding: 2px 0.4em; padding: 2px 0.4em;
line-height: 1.4; line-height: 1.4;
min-height: 0; /* support: IE7 */ min-height: 0;
/* support: IE7 */
} }
.ui-widget-content { .ui-widget-content {
border: 1px solid #bbb; border: 1px solid #bbb;
background: #fff; background: #fff;
color: #555; color: #555;
} }
.ui-widget-content a { .ui-widget-content a {
color: #46799b; color: #46799b;
} }
.ui-widget-content .ui-state-hover, .ui-widget-content .ui-state-hover,
.ui-widget-header .ui-state-hover, .ui-widget-header .ui-state-hover,
.ui-state-focus, .ui-state-focus,
@ -146,26 +163,36 @@
.ui-widget-header .ui-state-focus { .ui-widget-header .ui-state-focus {
background: #e0eaf1; background: #e0eaf1;
} }
.ui-helper-hidden-accessible { .ui-helper-hidden-accessible {
display: none; display: none;
} }
/* les styles de gamumails */
.formulaire_gamumail { .formulaire_gamumail {
padding-top: 0; padding-top: 0;
} }
.formulaire_gamumail .editer { .formulaire_gamumail .editer {
padding-top: 0; padding-top: 0;
} }
.editer_pour { .editer_pour {
display: flex; display: flex;
} }
.editer_pour label { .editer_pour label {
width: 50px; width: 50px;
} }
.editer_envoi_separe {
display: flex;
}
.editer_cc { .editer_cc {
display: flex; display: flex;
} }
.editer_cc label { .editer_cc label {
width: 50px; width: 50px;
} }
@ -173,6 +200,73 @@
.editer_cci { .editer_cci {
display: flex; display: flex;
} }
.editer_cci label { .editer_cci label {
width: 50px; 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 {
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;
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 142 KiB

View file

@ -1,20 +1,28 @@
#CACHE{0} #CACHE{0}
<link rel="stylesheet" href="[(#CHEMIN{css/gamumail.css}|timestamp)]" type="text/css" media="screen" charset="utf-8"> <link rel="stylesheet" href="[(#CHEMIN{css/gamumail.css}|timestamp)]" type="text/css" media="screen" charset="utf-8" />
<div class="formulaire_spip formgtulaire_#FORM"> [(#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)
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] ]<INCLURE{fond=inclure/fermer_modale,env}>
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>] [(#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}|explode{@@}|table_valeur{0})</p>]
<form name="formulaire_#FORM" action="#ENV{action}" method="post"><div> <form name="formulaire_#FORM" action="#ENV{action}" method="post"><div>
#ACTION_FORMULAIRE{#ENV{action}} #ACTION_FORMULAIRE{#ENV{action}}
#SET{fichier,#SLUG|concat{_debutform}} #SET{fichier,#SLUG|concat{_debutform}}
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui) [(#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"> <div class="editer_groupe">
#SET{name,pour} #SET{name,pour}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
@ -25,6 +33,25 @@
<input required type="text" class="text tagEditor" name="#GET{name}" id="#GET{name}" value="#ENV{#GET{name}}" > <input required type="text" class="text tagEditor" name="#GET{name}" id="#GET{name}" value="#ENV{#GET{name}}" >
</div> </div>
</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"> <div class="editer_groupe">
#SET{name,cc} #SET{name,cc}
@ -48,12 +75,25 @@
</div> </div>
</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"> <div class="editer_groupe">
#SET{name,sujet} #SET{name,sujet}
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"} #SET{obli,"obligatoire"}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <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>] [<span class="erreur_message">(#GET{erreurs})</span>]
<input required type="text" class="text sujet" name="#GET{name}" id="#GET{name}" value="#ENV{#GET{name}}" > <input required type="text" class="text sujet" name="#GET{name}" id="#GET{name}" value="#ENV{#GET{name}}" >
</div> </div>
@ -64,69 +104,74 @@
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"} #SET{obli,"obligatoire"}
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <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>] [<span class="erreur_message">(#GET{erreurs})</span>]
<textarea required class="textarea texte" name="#GET{name}" id="#GET{name}" rows="7">[(#ENV{#GET{name}})]</textarea> <textarea required class="textarea texte" name="#GET{name}" id="#GET{name}" rows="7">[(#ENV{#GET{name}})]</textarea>
</div> </div>
</div> </div>
#SET{fichier,#SLUG|concat{_soustexte}} <div class="gestion_documents">
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui) <div class="colonne_droite">
<INCLURE{fond=gamumail/#GET{fichier},env}> <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,lang=#GET{lang_dest}}>
]
<INCLURE{fond=gamumail/inc-pdf_envoyes,env}>
#SET{name,Tpdfs_ok} #SET{name,docs_spip}
<B_pdf> <div class="documents_attaches">
<h2>Fichiers PDF envoyés</h2> <h2><:gamumail:documents_attaches:></h2>
<div class="editer_groupe"> <div class="w500p">
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"} <div class="editer editer_[(#GET{name})][ (#GET{erreurs}|oui)erreur]">
<div class="editer editer_[(#GET{name})][ (#GET{obli})][ (#GET{erreurs}|oui)erreur]"> <div class="choix">
<BOUCLE_pdf(DATA){source tableau, #ENV{TFichierpdfs}}> [<span class="erreur_message">(#GET{erreurs})</span>]
<div class="choix"> <label for="#GET{name}"><:gamumail:id_docs_attaches:></label>
<input type="checkbox" class="checkbox" name="#GET{name}[]" value="#VALEUR" id="#GET{name}_#COMPTEUR_BOUCLE" checked="checked" > <input type="text" class="text" name="#GET{name}" value="[(#ENV{#GET{name}})]" id="#GET{name}" >
<label for="#GET{name}_#COMPTEUR_BOUCLE">#VALEUR</label> </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> </div>
</BOUCLE_pdf> </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>]
<h2><:gamumail:fichiers_annexes:></h2>
<INCLURE{fond=gamumail/#GET{fichier},env,options=#ENV{options}}>
]
</div> </div>
</div> </div>
</B_pdf>
#SET{id_gamumail,0}
#SET{name,Tid_doc}
<BOUCLE_slug(GAMUMAILS){slug}{tout}> #SET{id_gamumail,#ID_GAMUMAIL} </BOUCLE_slug>
<B_doc>
<h2>Autres Fichiers attachés</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_doc(DOCUMENTS){id_gamumail=#GET{id_gamumail}}>
<div class="choix">
<input type="checkbox" class="checkbox" name="#GET{name}[]" value="#ID_DOCUMENT" id="#GET{name}_#ID_DOCUMENT" checked="checked" >
<label for="#GET{name}_#ID_DOCUMENT">[(#TITRE|sinon{#FICHIER|basename})]</label>
</div>
</BOUCLE_doc>
</div>
</div>
</B_doc>
#SET{fichier,#SLUG|concat{_fichiers}}
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui)
<INCLURE{fond=gamumail/#GET{fichier},env}>
]
<div class="boutons"> <hr>
<div class="boutons text-center">
<button type="submit" class="btn"><:gamumail:envoyer:></button> <button type="submit" class="btn"><:gamumail:envoyer:></button>
</div> </div>
</div></form> </div></form>
</div> </div>
<script src="[(#CHEMIN{js/jquery.tag-editor.min.js}|timestamp)]" type="text/javascript"></script> <script src="[(#CHEMIN{js/jquery.tag-editor.min.js}|timestamp)]" type="text/javascript"></script>
<script src="[(#CHEMIN{js/jquery.caret.min.js}|timestamp)]" type="text/javascript"></script> <script src="[(#CHEMIN{js/jquery.caret.min.js}|timestamp)]" type="text/javascript"></script>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function() { jQuery(function() {
gamumail(); gamumail();

View file

@ -1,28 +1,49 @@
<?php <?php
if (!defined('_ECRIRE_INC_VERSION')) return; if (!defined('_ECRIRE_INC_VERSION')) return;
include_spip('inc/filtres'); include_spip('inc/filtres');
/** /**
* formulaire générique pour envoyer des mails avec pieces attachés * formulaire générique pour envoyer des mails avec pieces attachés
* *
* @param string $slug modele du mail a charger * @param string $slug modele du mail a charger
* @param int|string $auteur id_auteur ou email du destinataire * @param string $destinataires = adresses mails et id_auteurs séparées par , ou en array
* @param array $Tclient []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] * 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 $Tpdf []['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] ou ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] * @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', '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, '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 string $redirect
* @param array $options * @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
*
* @return array $valeurs * @return array $valeurs
*
*/ */
function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){ function formulaires_gamumail_charger_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){
$Tmails = []; $Tmails = [];
if (intval($auteur)) {
$Tmails[] = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.intval($auteur)); $Tcc = lire_config('gamumail/mail_cc') !== '' ? explode(',', lire_config('gamumail/mail_cc', '')) : [];
} elseif (is_string($auteur)) { $Tcci = lire_config('gamumail/mail_cci') !== '' ? explode(',', lire_config('gamumail/mail_cci', '')) : [];
if (email_valide($auteur)) {
$Tmails[] = $auteur; $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)) {
$Tmails[] = $mail;
}
}
elseif (email_valide($dest)) {
$Tmails[] = $dest;
} }
} }
@ -34,8 +55,13 @@ function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $T
$table = table_objet_sql($o['objet']); $table = table_objet_sql($o['objet']);
$id = id_table_objet($o['objet']); $id = id_table_objet($o['objet']);
$mail = sql_getfetsel("{$o['champ']}", $table, "$id=".intval($o['id_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 (email_valide($mail)) {
$Tmails[] = $mail; if (!$copie) {
$Tmails[] = $mail;
} else {
$copie == 'cc' ? $Tcc[] = $mail : $Tcci[] = $mail;
}
} }
} }
} }
@ -45,81 +71,280 @@ function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $T
if (array_key_exists('fichier', $Tpdf)) { if (array_key_exists('fichier', $Tpdf)) {
$Tpdf = [$Tpdf]; $Tpdf = [$Tpdf];
} }
foreach ($Tpdf as $pdf) { foreach ($Tpdf as $id => $pdf) {
$TFichierPdf[] = $pdf['fichier']; $TFichierPdf[$id] = $pdf;
} }
} }
$gamuMail = sql_fetsel('sujet, texte', 'spip_gamumails', 'slug='.sql_quote($slug)); $TFichierPdf = pipeline('gamumail_filtrer_tPDF', [
$valeurs = array( 'args' => [
"slug" => $slug, 'TFichierPdf' => $TFichierPdf
'sujet' => $gamuMail['sujet'], ],
'texte' => $gamuMail['texte'], 'data' => $TFichierPdf
'pour' => implode(',', $Tmails), ]
'cc' => lire_config('gamumail/mail_cc'),
'cci' => lire_config('gamumail/mail_cci'),
'TFichierpdfs' => $TFichierPdf,
'Tpdfs_ok' => [],
'Tid_doc' => [],
'options' => $options
); );
if ($f = charger_fonction('charger', 'gamumail', true)) { $gamuMail = [];
$valeurs = $f($valeurs, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); 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' => $sujet,
'texte' => $texte,
'pour' => implode(',', $Tmails),
'cc' => implode(',', $Tcc),
'cci' => implode(',', $Tcci),
'repondre_a' => implode(',', $Trepondre_a),
'TFichierpdfs' => $TFichierPdf,
'Tpdfs_ok' => [],
'docs_spip' => $gamuMail['id_docs'] ?? '',
'Tid_fichiers' => [],
'options' => $options,
'envoi_separe' => $options['envoi_separe'] ?? ''
);
// 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)) { if ($f = charger_fonction($slug . '_charger', 'gamumail', true)) {
$valeurs = $f($valeurs, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); $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; return $valeurs;
} }
function formulaires_gamumail_verifier_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{ function formulaires_gamumail_verifier_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{
$erreurs = array(); $erreurs = array();
//champs obligatoire //champs obligatoire
foreach (array ('pour', 'sujet', 'texte') as $obligatoire) { foreach (array('pour', 'sujet', 'texte') as $obligatoire) {
if (!_request($obligatoire)) $erreurs[$obligatoire] = 'Ce champs est obligatoire'; if (!_request($obligatoire)) $erreurs[$obligatoire] = 'Ce champs est obligatoire';
} }
if ($f = charger_fonction('verifier', 'gamumail', true)) { // le slug est il OK ?
$erreurs = $f($erreurs, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); if (preg_match('/[^a-zA-Z0-9_\-]/', $slug)) {
$erreurs['message_erreur'] = _T("gamumail:erreur_format_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 = [];
$pour = explode(',', _request('pour'));
foreach ($pour as $dest) {
if (is_numeric($dest)) {
if (!$mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
$Tid_erreur[] = $dest;
}
}
elseif (!email_valide($dest)) {
$Tmails_erreur[] = $dest;
}
}
if (count($Tid_erreur)) {
$erreurs['pour'] = _T("gamumail:id_destinataires_sans_mails", ['ids_erreur' => join(', ', $Tid_erreur)]).' ';
}
if (count($Tmails_erreur)) {
$erreurs['pour'] .= _T("gamumail:mails_destinataires_en_erreur", ['mails_erreur' => join(', ', $Tmails_erreur)]);
}
// les id_document attachés sont-ils OK ?
$docs_spip = [];
if (_request('docs_spip') != '') {
$docs_spip = explode(',', _request('docs_spip'));
}
if (is_array($docs_spip) and count($docs_spip)) {
$docs_spip_erreurs = [];
foreach($docs_spip as $id_doc) {
if (intval($id_doc) != $id_doc
OR !sql_getfetsel('id_document', 'spip_documents', 'id_document='.$id_doc)) {
$docs_spip_erreurs[] = $id_doc;
}
}
if (count($docs_spip_erreurs)) {
$erreurs['docs_spip'] = _T("gamumail:id_docs_en_erreur", ['id_docs_erreurs' => join(', ', $docs_spip_erreurs)]);
}
}
// les fichiers envoyés par un éventuel inclure gamumail/#SLUG_fichiers.html sont ils OK ?
$Tid_doc = [];
$Tid_doc = _request('Tid_doc');
if (is_array($Tid_doc) and count($Tid_doc)) {
$Tid_doc_erreurs = [];
foreach($Tid_doc as $id_doc) {
if (intval($id_doc) != $id_doc
OR !sql_getfetsel('id_document', 'spip_documents', 'id_document='.$id_doc)) {
$Tid_doc_erreurs[] = $id_doc;
}
}
if (count($Tid_doc_erreurs)) {
$erreurs['Tid_doc'] = _T("gamumail:id_docs_en_erreur", ['id_docs_erreurs' => join(', ', $Tid_doc_erreurs)]);
}
}
// 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)) { if ($f = charger_fonction($slug . '_verifier', 'gamumail', true)) {
$erreurs = $f($erreurs, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); $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; return $erreurs;
} }
function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{
$retour = [];
function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{ // 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('inc/texte');
include_spip('classes/facteur'); 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'));
$Tid_doc = _request('Tid_doc');
$Tpdfs_ok = _request('Tpdfs_ok');
$texte = facteur_mail_html2text($html);
$pour = _request('pour');
$pour = explode(',', $pour); $pour = explode(',', $pour);
$destinataires = [];
foreach ($pour as $dest) {
if (is_numeric($dest)) {
if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
$destinataires[] = $mail;
}
} 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); $cc = explode(',', $cc);
$cci = explode(',', $cci); $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;
// les documents joints
$pieces_jointes = []; $pieces_jointes = [];
if ($f = charger_fonction('traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $destinataires, $Tclient, $Tpdf);
}
if ($f = charger_fonction($slug . '_traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $destinataires, $Tclient, $Tpdf);
}
if (!empty($Tid_doc)) { // les documents par id_document
foreach ($Tid_doc as $id_document) { $docs_spip = ($docs_spip != '' ? explode(',', $docs_spip) : []);
$Tdocument = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_document)); if (!empty($docs_spip)) {
$destination = _DIR_IMG.$Tdocument['fichier']; foreach ($docs_spip as $id_document) {
$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']; $extension = $Tdocument['extension'];
if ($Tdocument['titre']) { if ($Tdocument['titre']) {
$nom_fichier = $Tdocument['titre'] .".".$extension; $nom_fichier = $Tdocument['titre'] .".".$extension;
@ -131,20 +356,58 @@ function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $T
'chemin' => $destination, 'chemin' => $destination,
'nom' => $nom_fichier, 'nom' => $nom_fichier,
'encodage' => 'base64', 'encodage' => 'base64',
'mime' => $type_mime 'mime' => $type_mime,
'quoi' => 'docs_spip',
'qui' => $id_document
]; ];
} }
} }
// les pdfs // les documents par Tid_doc envoyés depuis inclure gamumail/#SLUG_fichiers.html
if ($f = charger_fonction('traiter_av_pdf', 'gamumail', true)) { if (!empty($Tid_doc)) {
$options = $f($options, $auteur, $Tclient, $Tpdf); foreach ($Tid_doc as $id_doc) {
} $Tdocs = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_doc));
if ($f = charger_fonction($slug . '_traiter_av_pdf', 'gamumail', true)) { $destination = _DIR_IMG.$Tdocs['fichier'];
$options = $f($options, $auteur, $Tclient, $Tpdf); $extension = $Tdocs['extension'];
if ($Tdocs['titre']) {
$nom_fichier = $Tdocs['titre'] .".".$extension;
} else {
$nom_fichier = basename($Tdocs['fichier']);
}
$type_mime = bigup_get_mime_type_extension($extension);
$pieces_jointes[] = [
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => $type_mime,
'quoi' => 'docs_spip',
'qui' => $id_doc
];
}
} }
$Tpdf_dell = []; // 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)) { if (!empty($Tpdfs_ok) and is_array($Tpdfs_ok)) {
if (array_key_exists('fichier', $Tpdf)) { if (array_key_exists('fichier', $Tpdf)) {
$Tpdf = [$Tpdf]; $Tpdf = [$Tpdf];
@ -152,88 +415,164 @@ function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $T
$recup_pdf = charger_fonction('charger_pdf','inc'); $recup_pdf = charger_fonction('charger_pdf','inc');
foreach ($Tpdfs_ok as $pdf) { foreach ($Tpdfs_ok as $pdf) {
foreach ($Tpdf as $p) { $nom = "mon_fichier";
if ($p['fichier'] === $pdf) { foreach ($Tpdf as $cle => $p) {
$c = $p['contexte']; if ($p['fichier'].'_'.$cle === $pdf) {
$nom = $p['nom']; $fichier = $p['fichier'];
$c = isset($p['contexte']) ? $p['contexte'] : [];
$nom = isset($p['nom']) ? $p['nom'] : $fichier;
} }
} }
$pdf = $recup_pdf($pdf, $c); $nom = pipeline('remplacements_slug', array(
$nom_fichier = $nom.'.pdf'; 'args' => $args,
$destination = _DIR_TMP.basename($nom_fichier); 'data' => $nom
$Tpdf_dell[] = $destination; ));
file_put_contents($destination,$pdf);
$pieces_jointes[] = [ $c = pipeline('tpdf_charger_contexte', [
'chemin' => $destination, 'args' => [
'nom' => $nom_fichier, 'destinataires' => $destinataires,
'encodage' => 'base64', 'contexte' => $c,
'mime' => 'application/pdf' '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;
file_put_contents($destination,$pdf);
$pieces_jointes[] = [
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => 'application/pdf',
'quoi' => 'pdf_genere',
'qui' => $fichier
];
}
}
}
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 = ''; $html_header = '';
if (find_in_path('gamumail/'.$slug .'_html_header.html')) {
if(find_in_path('gamumail/html_header.html')){
$html_header = recuperer_fond('gamumail/html_header', $options);
}
elseif (find_in_path($slug . '_html_header.html')) {
$html_header = recuperer_fond('gamumail/'.$slug . '_html_header', $options); $html_header = recuperer_fond('gamumail/'.$slug . '_html_header', $options);
} }
elseif(find_in_path('gamumail/html_header.html')) {
$html_footer = ''; $html_header = recuperer_fond('gamumail/html_header', $options);
if(find_in_path('gamumail/html_footer.html')){
$html_footer = recuperer_fond('gamumail/html_footer', $options);
} }
elseif (find_in_path($slug . '_html_footer.html')) { $html_footer = '';
if (find_in_path('gamumail/'.$slug . '_html_footer.html')) {
$html_footer = recuperer_fond('gamumail/'.$slug . '_html_footer', $options); $html_footer = recuperer_fond('gamumail/'.$slug . '_html_footer', $options);
} }
elseif (find_in_path('gamumail/html_footer.html')) {
$html_footer = recuperer_fond('gamumail/html_footer', $options);
}
$html = $html_header . $html . $html_footer; $html = $html_header . $html . $html_footer;
// 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 = [ $corps = [
'html' => $html, 'html' => $html,
'texte' => $texte, 'texte' => $texte,
'cc' => $cc, 'cc' => $cc,
'cci' => $cci, 'cci' => $cci,
'bcc' => $cci,
'pieces_jointes' => $pieces_jointes '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)) { if ($f = charger_fonction('traiter', 'gamumail', true)) {
$corps = $f($corps, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); $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)) { if ($f = charger_fonction($slug . '_traiter', 'gamumail', true)) {
$corps = $f($corps, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); $corps = $f($corps, $options, $slug, $destinataires);
} }
// envoi du mail // 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/'); $envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
$ok = $envoyer_mail($pour, $sujet, $corps); //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) { if (!$ok) {
spip_log("Erreur d'envoi du mail : ","roc_mail"); spip_log("Erreur d'envoi du mail : ","gamumail");
spip_log($corps,"roc"); spip_log($corps,"gamumail");
$retour['message_erreur'] = _T("gamumail:erreur_envoi_mail"); $retour['message_erreur'] = _T("gamumail:erreur_envoi_mail");
} else { }
else {
$retour['message_ok'] = _T('gamumail:mail_envoye'); $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 // on supprime les pdfs temporaires
if (count($Tpdf_dell)) { if (count($Tpdf_del)) {
foreach ($Tpdf_dell as $pdf) { foreach ($Tpdf_del as $pdf) {
unlink($pdf); unlink($pdf);
} }
} }
if ($redirect) { return $ok;
$retour['redirect'] = $redirect;
}
return $retour;
}
function gamumail_supprimer_si_vide($v){
if (!empty($v)) {
return $v;
}
} }

View file

@ -0,0 +1,3 @@
</div>
</body>
</html>

12
gamumail/html_header.html Normal file
View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>#NOM_SITE_SPIP</title>
</head>
<body style="background-color:rgb(255, 255, 255)">
<div class="mail">
[<img src="(#LOGO_SITE_SPIP|image_reduire{200}|extraire_attribut{src}|url_absolue)" >]
<br>
<br>

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

@ -0,0 +1,19 @@
[(#REM)
la liste des remplacements joués dans tous les slugs GamuMail
+ tous ceux des plugins qui les documentent via $GLOBALS'remplacements_gamumail'
inclure pour la page de configuration des gamumails
]
<div class="remplacements_slugs">
<h3 class="spip"><:gamumail:remplacements_disponibles:></h3>
<ul class="">
<BOUCLE_remplace(DATA){source tableau, #VAL|afficher_remplacements}>
<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

@ -26,32 +26,84 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function gamumail_upgrade($nom_meta_base_version, $version_cible) { function gamumail_upgrade($nom_meta_base_version, $version_cible) {
$maj = array(); $maj = array();
$maj['create'] = array(array('maj_tables', array('spip_gamumails'))); $maj['create'] = array(
array('maj_tables', array('spip_gamumails')),
array('creer_compte_curl', 'creer_slugs'),
);
$maj['1.0.2'] = array(array('maj_tables', array('spip_gamumails'))); $maj['1.0.2'] = array(array('maj_tables', array('spip_gamumails')));
$maj['1.0.5'] = array(array('creer_compte_curl')); $maj['1.0.5'] = array(array('creer_compte_curl'));
$maj['1.0.6'] = array(array('maj_tables', array('spip_gamumails')));
$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'));
function creer_compte_curl(){
$mdp = uniqid(uniqid(),1);
$set = [
'nom' => 'curl_login',
'login' => hash('md5', 'curl_login'.time()),
'pass' => hash('sha256', $mdp),
'statut' => '1comite'
];
include_spip('action/editer_auteur');
$id_auteur = auteur_inserer(null, $set);
if ($id_auteur) {
include_spip('inc/config');
ecrire_config('curl_login', $set['login']);
ecrire_config('curl_mdp', $mdp);
}
}
include_spip('base/upgrade'); include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj); 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('spip_auteurs', 'nom="curl_login"')){
return;
}
$mdp = uniqid(uniqid(),1);
$set = [
'nom' => 'curl_login',
'login' => hash('md5', 'curl_login'.time()),
'pass' => hash('sha256', $mdp),
'statut' => '1comite'
];
include_spip('action/editer_auteur');
$id_auteur = auteur_inserer(null, $set);
if ($id_auteur) {
include_spip('inc/config');
ecrire_config('curl_login', $set['login']);
ecrire_config('curl_mdp', $mdp);
}
}
/** /**
* Fonction de désinstallation du plugin GamuMail. * Fonction de désinstallation du plugin GamuMail.

View file

@ -13,7 +13,6 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
/** /**
* Fonction d'appel pour le pipeline * Fonction d'appel pour le pipeline
* @pipeline autoriser */ * @pipeline autoriser */
@ -21,64 +20,39 @@ function gamumail_autoriser() {
} }
// -----------------
// Objet gamumails
/** /**
* Autorisation de créer (gamumail) * Objet gamumails
* **/
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_gamumail_creer_dist($faire, $type, $id, $qui, $opt) { function autoriser_gamumail_creer_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite')); return $qui['statut'] == '0minirezo' and !$qui['restreint'];
} }
/**
* Autorisation de voir (gamumail)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_gamumail_voir_dist($faire, $type, $id, $qui, $opt) { function autoriser_gamumail_voir_dist($faire, $type, $id, $qui, $opt) {
return true; return true;
} }
/**
* Autorisation de modifier (gamumail)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_gamumail_modifier_dist($faire, $type, $id, $qui, $opt) { function autoriser_gamumail_modifier_dist($faire, $type, $id, $qui, $opt) {
return in_array($qui['statut'], array('0minirezo', '1comite')); return $qui['statut'] == '0minirezo' and !$qui['restreint'];
} }
/**
* Autorisation de supprimer (gamumail)
*
* @param string $faire Action demandée
* @param string $type Type d'objet sur lequel appliquer l'action
* @param int $id Identifiant de l'objet
* @param array $qui Description de l'auteur demandant l'autorisation
* @param array $opt Options de cette autorisation
* @return bool true s'il a le droit, false sinon
**/
function autoriser_gamumail_supprimer_dist($faire, $type, $id, $qui, $opt) { function autoriser_gamumail_supprimer_dist($faire, $type, $id, $qui, $opt) {
return $qui['statut'] == '0minirezo' and !$qui['restreint']; return $qui['statut'] == '0minirezo' and !$qui['restreint'];
} }
function autoriser_gamumail_configurer_dist($faire, $type, $id, $qui, $opt) {
return autoriser('webmestre');
}
/**
* Autorisation de modifier le nom d'un slug
* uniquement les webmestres avec un mail en @gamuza.fr
* sauf si editable=non (pour les slugs créés par des plugins)
**/
function autoriser_gamumail_modifier_nom_slug_dist($faire, $type, $id, $qui, $opt) {
$editable = sql_getfetsel('editable', 'spip_gamumails', 'id_gamumail='.intval($id));
if (
intval($id)
and $editable != 'non'
) {
return
autoriser('webmestre')
and strpos($qui['email'], 'gamuza.fr') !== false;
}
return false;
}

View file

@ -13,6 +13,103 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
function gamumail_TabClient($objet, $id_objet, $champ){ // retourne un array OK comme élément du paramètre $Tclient passé à gamumail_charger
return compact('objet', 'id_objet', 'champ'); function gamumail_TabClient($objet, $id_objet, $champ, $copie=''){
return compact('objet', 'id_objet', 'champ', 'copie');
}
function gamumail_supprimer_si_vide($v){
if (!empty($v)) {
return $v;
}
}
function tester_slug($slug, $destinataires,$options=[]) {
$f = charger_fonction('envoyer_gamumail', 'inc');
$options['debug'] = true;
return $f($slug, $destinataires, $options);
}
/**
* modèles pour surcharge des fonctions du CVT gamumail
* chacune de ces fonctions a un équivalent spécifique pour chaque slug
* avec un nom de la forme gamumail_$slug_charger(), gamumail_$slug_verifier()...
**/
/**
* fonction appelée en fin de gamumail_charger_dist()
*
* @return $valeurs = array(
* "slug" => $slug,
* 'sujet' => $gamuMail['sujet'],
* 'texte' => $gamuMail['texte'],
* 'pour' => implode(',', $Tmails),
* 'cc' => lire_config('gamumail/mail_cc'),
* 'cci' => lire_config('gamumail/mail_cci'),
* 'TFichierpdfs' => $TFichierPdf,
* 'Tpdfs_ok' => [],
* 'Tid_doc' => [],
* 'options' => $options
* );
*
**/
function gamumail_charger_dist($valeurs, $options, $slug, $destinataires='', $Tclient=[], $Tpdf=[], $redirect='') {
return $valeurs;
}
/**
* fonction appelée en fin de gamumail_verifier_dist()
*
* @return array $erreurs
*
**/
function gamumail_verifier_dist($erreurs, $options, $slug, $destinataires='', $Tclient=[], $Tpdf=[], $redirect='') {
return $erreurs;
}
/**
* fonctions appelée en fin de gamumail_traiter_dist()
*
* @param array $corps[] => cf return
* @param string $slug modele du mail a charger
* @param string $destinataires = adresses mails et id_auteurs séparées par ,
* @param array $options
*
* @return array $corps
* $corps = [
* 'html' => $html,
* 'texte' => $texte,
* 'cc' => $cc,
* 'cci' => $cci,
* 'pieces_jointes' => $pieces_jointes
* ];
*
**/
function gamumail_traiter_dist($corps, $options, $slug, $destinataires='') {
$html = $corps['html'];
include_spip('classes/facteur');
$texte = facteur_mail_html2text($html);
$corps['html'] = $html;
$corps['texte'] = $texte;
return $corps;
}
function gamumail_remplacer_modele($modele, $val, $texte){
if ($texte and $modele and $val) {
return str_replace('@@'.$modele.'@@', $val, $texte);
}
return $texte;
}
/**
* le filtre pour retourner l'array des remplacements
**/
function afficher_remplacements() {
return $GLOBALS['remplacements_gamumail'];
} }

View file

@ -20,3 +20,20 @@ function crayons_determine_input_mode_type_gamumail($type, $champ, $sqltype) {
return in_array($champ, $Ttextarea) ? 'texte' : 'ligne'; return in_array($champ, $Ttextarea) ? 'texte' : 'ligne';
} }
/**
* pour la doc fournie par inclure/remplacements_slugs.html
* $GLOBALS['remplacements_gamumail'] est l'array global des remplacements dans les slugs (sera complété avec les remplacements des plugins)
* de la forme : ['@@truc_a_remplacer_1@@' => 'le machin qui remplace 1', '@@truc_a_remplacer_2@@' => _T('gamumail:chaine_de_langue_2')...];
*
**/
$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

@ -13,9 +13,34 @@ if (!defined('_ECRIRE_INC_VERSION')) {
return; return;
} }
/**
* pipeline pour faire les remplacements des @@ dans le contenu du slug envoyé dans $flux
*
* @param array $flux données du pipeline :
* $flux['data'] = $html
* $flux['args']['slug'] = $slug
* $flux['args']['destinataires'] = $destinataires
* $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 * Optimiser la base de données
@ -26,9 +51,11 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* @param array $flux Données du pipeline * @param array $flux Données du pipeline
* @return array Données du pipeline * @return array Données du pipeline
*/ */
/*
function gamumail_optimiser_base_disparus($flux) { function gamumail_optimiser_base_disparus($flux) {
sql_delete('spip_gamumails', "statut='poubelle' AND maj < " . $flux['args']['date']); sql_delete('spip_gamumails', "statut='poubelle' AND maj < " . $flux['args']['date']);
return $flux; return $flux;
} }
*/

View file

@ -3,34 +3,7 @@ if (!defined('_ECRIRE_INC_VERSION')){
return; return;
} }
function inc_charger_pdf_dist($fichier_pdf, $contexte = [], $args = []){
function inc_charger_pdf_dist($fichier_pdf, $contexte = []){ $f = charger_fonction('generer_pdf','gamu');
$login = lire_config('curl_login'); return $f($fichier_pdf, $contexte);
$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 = intval($val);
} else {
$val = "$val";
}
$url .= "&$champ=$val";
}
}
$CurlConnect = curl_init();
// pour une connexion https locale (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;
} }

312
inc/envoyer_gamumail.php Normal file
View file

@ -0,0 +1,312 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')){
return;
}
/*
* fonction pour préparer et envoyer un mail basé sur un slug gamumail
*
* @param string $slug
* @param string|array $destinataires = adresses mails et id_auteur 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 $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['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',
* 'contexte' => ['parametre_url_1' => 'valeur_1', 'parametre_url_2' => 'valeur_2', ...]
* 'nom' => 'nom_fichier_attache' ]
* $options['pieces_jointes'][] = [
* 'chemin' => 'tmp/cache/toto.xls',
* 'nom' => 'toto.xls',
* 'encodage' => 'base64',
* 'mime' => 'application/vnd.ms-excel'
* ]
* ]
* $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 = [], $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 = extraire_multi($res['sujet'], $lang);
$html = propre($res['texte']);
$id_docs = $res['id_docs'];
}
else {
$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)) {
$destinataires = explode(',', $destinataires);
}
$pour = array();
foreach ($destinataires as $dest) {
if (is_numeric($dest)) {
if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
$pour[] = $mail;
}
}
elseif (email_valide($dest)) {
$pour[] = $dest;
}
}
$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);
$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 = [];
// filtrage des id_docs attachés au slug (ici on ne veut que des id_docs valides)
$Tid_doc = [];
$id_docs = array_filter(explode(',', $id_docs), 'is_numeric');
foreach ($id_docs as $doc) {
if ($res = sql_getfetsel('id_document', 'spip_documents', 'id_document='.$doc)) {
$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) {
$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;
}
else {
$nom_fichier = basename($Tdocument['fichier']);
}
include_spip('bigup_fonctions');
$type_mime = bigup_get_mime_type_extension($extension);
$pieces_jointes[] = [
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => $type_mime
];
}
}
// les docs attachés
if (isset($options['pieces_jointes'])) {
if (is_array($options['pieces_jointes'])) {
foreach ($options['pieces_jointes'] as $Tpj) {
$pieces_jointes[] = $Tpj;
}
}
}
// les pdfs
$Tpdf_dell = [];
if (isset($options['pdfs'])) {
$Tpdfs = $options['pdfs'];
if (!is_array($Tpdfs)) {
$Tpdfs = explode(',', $Tpdfs);
}
$Tpdfs = array_filter($Tpdfs, function($p) {
return $p != '';
});
// approximation pour passage dans les fonctions traiter_av_pdf() :
// si plusieurs destinataires dans $pour[], on utilise le premier comme 2ème arg ($auteur)
if ($f = charger_fonction('traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $pour[0], [], $Tpdfs);
}
if ($f = charger_fonction($slug . '_traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $pour[0], [], $Tpdfs);
}
if (!empty($Tpdfs) and is_array($Tpdfs)) {
foreach ($Tpdfs as $pdf) {
if (!is_array($pdf)) {
$sq_pdf = $pdf;
$contexte = [];
$nom = $pdf;
}
elseif (array_key_exists('fichier', $pdf)) {
$sq_pdf = $pdf['fichier'];
$contexte = array_key_exists('contexte', $pdf) ? $pdf['contexte'] : [];
$nom = array_key_exists('nom', $pdf) ? $pdf['nom'] : $pdf;
}
else break;
$recup_pdf = charger_fonction('charger_pdf','inc');
$pdf = $recup_pdf($sq_pdf, $contexte);
$nom_fichier = $nom.'.pdf';
$destination = _DIR_TMP.basename($nom_fichier);
$Tpdf_dell[] = $destination;
file_put_contents($destination,$pdf);
$pieces_jointes[] = [
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => 'application/pdf'
];
}
}
}
$html_header = '';
if (find_in_path('gamumail/'.$slug .'_html_header.html')) {
$html_header = recuperer_fond('gamumail/'.$slug . '_html_header', $options);
}
elseif(find_in_path('gamumail/html_header.html')) {
$html_header = recuperer_fond('gamumail/html_header', $options);
}
$html_footer = '';
if (find_in_path('gamumail/'.$slug . '_html_footer.html')) {
$html_footer = recuperer_fond('gamumail/'.$slug . '_html_footer', $options);
}
elseif (find_in_path('gamumail/html_footer.html')) {
$html_footer = recuperer_fond('gamumail/html_footer', $options);
}
$html = $html_header . $html . $html_footer;
// pipeline pour les remplacements du contenu des slugs spécifiques de chaque plugins
$args = $options;
$args['slug'] = $slug;
$args['destinataires'] = $pour;
$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,
'bcc' => $cci,
'pieces_jointes' => $pieces_jointes
];
/*
if ($f = charger_fonction('traiter', 'gamumail', true)) {
$corps = $f($corps, $options, $slug, $auteur, $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, $pour);
}
// si debug on affiche sans envoyer le mail
if (isset($options['debug']) AND $options['debug']) {
echo '<br>slug : '.$slug;
echo '<br>$options :';
var_dump($options);
echo '<br>$pour : ';
var_dump($pour);
echo '<br>$sujet : '.$sujet;
echo '<br>$corps : ';
var_dump($corps);
$ok = true;
//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, $from, $header);
}
if (!$ok) {
spip_log("Erreur d'envoi du mail : ","gamumail");
spip_log($corps,"gamumail");
$retour['message_erreur'] = _L("gamumail:erreur_envoi_mail");
}
else {
$retour['message_ok'] = _L('gamumail:mail_envoye');
}
// on supprime les pdfs temporaires
if (count($Tpdf_dell)) {
foreach ($Tpdf_dell as $pdf) {
unlink($pdf);
}
}
return $retour;
}

View file

@ -0,0 +1,93 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) {
return;
}
/**
* fonction pour les remplacements génériques fournis par gamumail
*
* @param array $args = ['slug' => $slug, 'destinataires' => $pour, [$options]]
* @param string $data = $html
*
* @return $html
*
**/
function inc_gamumail_remplacements_dist($args, $html) {
$slug = $args['slug'];
/**
* @@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.
**/
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'])) {
$prenom = sql_getfetsel('prenom', 'spip_auteurs', 'email='.sql_quote($args['destinataires'][0])) ?? ' ';
}
$html = gamumail_remplacer_modele('prenom', ucwords($prenom), $html);
/**
* @@url_site@@ => URL du site
**/
$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

@ -0,0 +1,51 @@
[(#REM)
page d'envoi d'un gamumail
]
<style type="text/css" media="screen">
.bloc_slug {
margin-top: 3rem;
}
.markItUp .markItUpHeader ul a em {
width: 2rem;
height: 2rem;
}
#bloc_slug .formulaire_spip textarea.markItUpEditor {
width: 100%;
}
#bloc_slug .sujet {
width: calc(100% - 50px);
}
#bloc_slug .editer_groupe {
margin-bottom: 1rem;
}
</style>
<div class="envoi_gamumail">
<B_slugs>
<div class="bloc_choix_slug">
<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}{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,dest=#ENV{dest},ajax=vue_slug}>
</div>
<INCLURE{fond=gamumail/remplacements_slugs}>
</div>
<script type="text/javascript">
jQuery(function() {
$('#choix_slug').on('change', function() {
var choix_slug = $(this).val();
ajaxReload('vue_slug', {
args:{
slug : choix_slug
}
});
});
});
</script>

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

@ -1,92 +1,192 @@
[(#AUTORISER{modifier,gamumail}|sinon_interdire_acces)]
<style type="text/css" media="screen"> <style type="text/css" media="screen">
.configuration_mails .objet--mail span { .configuration_mails .objet--mail span {
display: inline-block; display: inline-block;
width: 100%; width: 100%;
} }
.well { .configuration_mails .objet--mail {
background-color: #cecece; margin-top: 1.5rem;
margin: 10px auto; }
padding: 10px; .configuration_mails .well {
border-radius: 4px; background-color: #cecece;
.crayon { margin: 10px auto;
background-color: #fff; padding: 10px;
} border-radius: 4px;
} }
.un-pdf { .configuration_mails .un-pdf {
border: 1px solid black; border: 1px solid black;
margin-bottom: 1rem; margin-bottom: 1rem;
padding: 10px; padding: 10px;
} }
span.label { .configuration_mails span.label {
display: inline-block; display: inline-block;
width: 180px; width: 180px;
} }
.configuration_mails span.crayon, .configuration_mails div.crayon {
background-color: #fff;
padding: .5rem;
}
.configuration_mails .well h4.crayon {
background-color: #cecece;
}
.configuration_mails .wp600 {
width: 600px;
}
.configuration_mails .btn_supprimer {
float: right;
}
.configuration_mails .btn_editer {
float: right;
margin-right: 2rem;
}
.configuration_mails .btn {
display: inline-block;
padding: 1rem 1.5rem;
cursor: pointer;
user-select: none;
transition: 0.25s;
transition-property: box-shadow, background-color, color, border;
text-align: center;
vertical-align: middle;
white-space: nowrap;
border: none;
border-radius: 0;
background-color: #e7e9ed;
font-family: inherit;
font-size: inherit;
line-height: 1;
}
.configuration_mails .markItUp .markItUpHeader ul a em {
width: 2rem;
height: 2rem;
}
.configuration_mails span > em {
font-size: 85%;
}
.configuration_mails .remplacements_slugs {
margin-top: 4rem;
}
.configuration_mails .name_config {
font-size: 1rem;
float: right;
}
</style> </style>
<div class="inner configuration_mails"> <div class="inner configuration_mails">
<h1 class="txtcenter">Configuration des mails</h1> [(#REM) <h1>Configuration des mails</h1> ]
<div class="configuration_generale"> <div class="configuration_generale">
<h2>Paramétres généraux</h2>
<div class="well"> <div class="well">
<div class="une_conf"> <div class="une_conf">
<h4>Emails en copie "cc" des différents messages <small class="name_config">gamumail/mail_cc</small>
<span class="#EDIT{meta-gamumail/mail_cc} inbl w600p">[(#CONFIG{gamumail/mail_cc}|sinon{cliquer})]</span> <h4><:gamumail:email_en_cc:></h4>
</h4> <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">Si plusieurs emails, les séparer par une virgule</p> <p class="explication"><:gamumail:plusieurs_mails_separer_virgule:>.</p>
</div>
<div class="une_conf">
<h4>Emails en copie cachée "cci" des différents messages
<span class="#EDIT{meta-gamumail/mail_cci} inbl w600p">[(#CONFIG{gamumail/mail_cci}|sinon{cliquer})]</span>
</h4>
<p class="explication">Si plusieurs emails, les séparer par une virgule</p>
</div> </div>
</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 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>
<div class="well"> <h2>Modèles de mails</h2>
<div class="une_conf"> <h3 class="explication"><:gamumail:dbe_clic_editer_champs:></h3>
<h4 class="toggle cursor" <BOUCLE_message(GAMUMAILS){par rang, num titre}>
data-id="#SLUG"> <div class="well">
<i class="fa fa-envelope mrs"></i> <div class="une_conf">
[(#TITRE)] [(#AUTORISER{supprimer,gamumail}|oui)
<i class="fa fa-caret-down"></i> <a class="btn btn_supprimer" title="<:gamumail:supprimer_modele:>" href="[(#URL_ACTION_AUTEUR{supprimer_slug,#ID_GAMUMAIL,#SELF})]"><i class="fa fa-trash"></i></a>
</h4> ]
<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-#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">
[(#AUTORISER{webmestre}|oui) <div class="objet--slug">
<div class="objet--slyg"> <strong><:gamumail:slug:>: </strong>
<strong>Slug : </strong> [(#AUTORISER{modifier_nom_slug, gamumail, #ID_GAMUMAIL}|?{
<span class="#EDIT{slug}">[(#SLUG|sinon{cliquez})]</span> <span class="[(#EDIT{nom_slug})] nomulti">[(#SLUG|sinon{<:gamumail:dbe_clic_editer:>})]</span>
</div> ,
] <span class="">[(#SLUG)]</span>
<div class="objet--mail"> })]
<strong>Objet : </strong>
<span class="#EDIT{sujet}">[(#SUJET|sinon{cliquez})]</span>
</div>
<strong>Message : </strong>
<div class="texte #EDIT{texte}">[(#TEXTE|sinon{cliquez})]</div>
[(#REM)
Pour l'instant, inutile
<div class="pdfs">
<INCLURE{fond=inclure/gamumail_pdfs,env,id_gamumail, ajax}>
</div>
]
[(#ENV{ajouter_doc}|oui)
<div class="ajax">
#FORMULAIRE_BIGFORM{gamumail, #ID_GAMUMAIL}
</div>
]
</div> </div>
<div class="objet--mail">
<strong><:gamumail:objet:>: </strong>
<span class="#EDIT{sujet}">[(#SUJET|sinon{<:gamumail:dbe_clic_editer:>})]</span>
</div>
<div class="objet--mail">
<strong><:gamumail:message:>: </strong>
<div class="texte #EDIT{texte}">
[(#TEXTE|sinon{<:gamumail:dbe_clic_editer:>})]
</div>
</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} 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>
[(#PUBLIC|=={oui}|oui)
<strong><i class="fa fa-eye"></i> <:gamumail:modele_visible:> => </strong>
<a class="btn btn_public ajax" title="<:gamumail:modele_masquer:>" href="[(#URL_ACTION_AUTEUR{switcher_slug_public,#ID_GAMUMAIL,#SELF})]">
<:gamumail:modele_masquer:> <i class="fa fa-eye-slash"></i>
</a>
][(#PUBLIC|=={oui}|non)
<strong><i class="fa fa-eye-slash"></i> <:gamumail:modele_non_visible:> => </strong>
<a class="btn btn_public ajax" title="<:gamumail:modele_afficher:>" href="[(#URL_ACTION_AUTEUR{switcher_slug_public,#ID_GAMUMAIL,#SELF})]">
<:gamumail:modele_afficher:> <i class="fa fa-eye"></i>
</a>
]
</div>
[(#REM)
Pour l'instant, inutile
<div class="pdfs">
<INCLURE{fond=inclure/gamumail_pdfs,env,id_gamumail, ajax}>
</div>
]
[(#ENV{ajouter_doc}|oui)
<div class="ajax">
#FORMULAIRE_BIGFORM{gamumail, #ID_GAMUMAIL}
</div>
]
</div> </div>
</div> </div>
</BOUCLE_message> </div>
</BOUCLE_messages> </BOUCLE_message>
[(#AUTORISER{creer,gamumail}|oui)
<a class="btn" title="<:gamumail:creer_modele:>" href="[(#URL_ACTION_AUTEUR{creer_slug,null,#SELF})]"><i class="fa fa-envelope"></i> Nouveau modèle</a>
]
</div> </div>
<INCLURE{fond=gamumail/remplacements_slugs}>
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
jQuery(function() { jQuery(function() {
configuration_mails(); configuration_mails();
@ -98,5 +198,4 @@
}); });
} }
}); });
</script> </script>

View file

@ -3,7 +3,7 @@
] ]
<div class="pdfs"> <div class="pdfs">
[(#AUTORISER{webmestre}|oui) [(#AUTORISER{modifier,gamumail}|oui)
<a class="btn ajax nohistory nocache" href="[(#URL_ACTION_AUTEUR{gamuform_add_pdf,#ENV{id_gamumail},#SELF})]"> <a class="btn ajax nohistory nocache" href="[(#URL_ACTION_AUTEUR{gamuform_add_pdf,#ENV{id_gamumail},#SELF})]">
+ pdf + pdf
</a> </a>

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>

17
inclure/vue_slug.html Normal file
View file

@ -0,0 +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},
#GET{Tpdf},
#ENV{redirect},
#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

@ -10,16 +10,38 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// A // A
'ajouter_lien_gamumail' => 'Ajouter ce gamumail', '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 // C
'champ_slug_label' => 'Slug', 'champ_slug_label' => 'Slug',
'champ_sujet_label' => 'Sujet', 'champ_sujet_label' => 'Sujet',
'champ_texte_label' => 'Texte', 'champ_texte_label' => 'Texte',
'confirmer_supprimer_gamumail' => 'Confirmez-vous la suppression de cet gamumail ?', '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' => '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 //EE
'envoyer' => 'Envoyer', 'envoyer' => 'Envoyer',
"erreur_envoi_mail" => "Erreur dans l'envoi de votre mail", "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',
'fichiers_televerser' => 'Fichiers téléversés',
// I // I
'icone_creer_gamumail' => 'Créer un gamumail', 'icone_creer_gamumail' => 'Créer un gamumail',
@ -28,16 +50,46 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'info_aucun_gamumail' => 'Aucun gamumail', 'info_aucun_gamumail' => 'Aucun gamumail',
'info_gamumails_auteur' => 'Les gamumails de cet auteur', 'info_gamumails_auteur' => 'Les gamumails de cet auteur',
'info_nb_gamumails' => '@nb@ gamumails', '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 //MM
"mail_envoye" => "Votre message a bien été envoyé", "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 // R
'retirer_lien_gamumail' => 'Retirer ce gamumail', 'retirer_lien_gamumail' => 'Retirer ce gamumail',
'retirer_tous_liens_gamumails' => 'Retirer tous les gamumails', 'retirer_tous_liens_gamumails' => 'Retirer tous les gamumails',
'remplacements_disponibles' => 'Remplacements automatiques disponibles :',
// S // S
'supprimer_gamumail' => 'Supprimer cet gamumail', 'supprimer_gamumail' => 'Supprimer cet gamumail',
'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 // T
'texte_ajouter_gamumail' => 'Ajouter un gamumail', 'texte_ajouter_gamumail' => 'Ajouter un gamumail',
@ -50,4 +102,12 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'titre_langue_gamumail' => 'Langue de ce gamumail', 'titre_langue_gamumail' => 'Langue de ce gamumail',
'titre_logo_gamumail' => 'Logo de ce gamumail', 'titre_logo_gamumail' => 'Logo de ce gamumail',
'titre_objets_lies_gamumail' => 'Liés à 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 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 <paquet
prefix="gamumail" prefix="gamumail"
categorie="communication" categorie="communication"
version="1.0.6" version="1.4.6"
etat="dev" etat="dev"
compatibilite="[3.3.0-dev;3.3.*]" compatibilite="[3.2.0;4.*]"
logo="prive/themes/spip/images/gamumail-64.png" logo="prive/themes/spip/images/gamumail-64.png"
documentation="" documentation=""
schema="1.0.5" schema="1.0.17"
> >
<nom>GamuMail</nom> <nom>GamuMail</nom>
@ -15,10 +15,15 @@
<licence>GNU/GPL</licence> <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="crayons" compatibilite="[2.0.10;[" />
<necessite nom="facteur" compatibilite="[4.0.0;[" /> <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" /> <pipeline nom="autoriser" inclure="gamumail_autorisations.php" />

View file

@ -0,0 +1,27 @@
#CACHE{0}
[(#REM)
une saisie pour choisir un slug parmi ceux ayant statut publie
paramètres :
#ENV{nom} = le name du select (par défaut = slug)
#ENV{slug} = le slug sélectionné
#ENV{label}
#ENV{explication}
exemple d'appel :
[(#SAISIE{selecteur_slug,
slug=slug_truc,
nom=choix_slug,
label=Choisissez un slug,
explication=Le modèle de mail automatique pour...
})]
]<B_slugs>
<select name="#ENV{nom,slug}" id="#ENV{nom,slug}">
<option value=""[ (#ENV{slug}|non) selected="selected"]><:gamumail:selectionnez_modele:></option>
<BOUCLE_slugs(GAMUMAILS){statut=publie}>
<option value="#SLUG"[ (#ENV{slug}|=={#SLUG}|oui) selected="selected"]>#TITRE</option>
</BOUCLE_slugs>
</select>
</B_slugs>
<:gamumail:aucun_slug_disponible:>
<//B_slugs>

View file

@ -0,0 +1,3 @@
<BOUCLE_toto(GAMUMAILS){id_gamumail}>
#SLUG
</BOUCLE_toto>