Compare commits

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

63 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
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
18 changed files with 717 additions and 256 deletions

215
README.md
View file

@ -1,30 +1,41 @@
# gamuMail # gamuMail
> formulaire d'envoi de messages configurables > 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
* ID documents joints (spip_documents) - Texte
- ID documents joints (spip_documents)
--- ---
* Chaque modèle à un identifiant textuel : **slug** qui doit etre unique. Il ne peut etre créé / modifié QUE par les webmestres
* Pour gerer ses modèles, il faut se rendre sur la page : `?page=configuration_mails` - Chaque modèle à un identifiant textuel : **slug** qui doit etre unique. Il ne peut etre créé / modifié QUE par les webmestres
![configuration](doc/configuration.png "Exemple de configuration") - Pour gerer ses modèles, il faut se rendre sur la page : `?page=configuration_mails`
![configuration](doc/configuration.png "Exemple de configuration")
## Personnalisation du formulaire d'envoi ## 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>
@ -43,24 +54,28 @@ ex de fichier :
</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_fichiers.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: ### 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** - 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 : 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)
- 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']` - 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` : Exemple dans un fichier `prefixe_fonctions.php` :
```php ```php
$GLOBALS['remplacements_gamumail']['@@num_facture@@'] = 'numéro de la facture'; $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** - 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 : ### exemple de page d'envoi de mail en choisissant un slug parmi ceux existant :
```html ```html
[(#AUTORISER{modifier,souscripteur,#ENV{id_auteur}}|sinon_interdire_acces)] [(#AUTORISER{modifier,souscripteur,#ENV{id_auteur}}|sinon_interdire_acces)]
@ -76,9 +91,11 @@ $GLOBALS['remplacements_gamumail']['@@num_facture@@'] = 'numéro de la facture';
``` ```
### Dans le php ### Dans le php
#### 1. Appel du formulaire #### 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
@ -99,100 +116,93 @@ $GLOBALS['remplacements_gamumail']['@@num_facture@@'] = 'numéro de la facture';
function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){ function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){
} }
``` ```
#### argument $slug "no_gamumail" #### argument $slug "no_gamumail"
Si $slug à pour valeur **no_gamumail** alors l'envoi est annulé Si $slug à pour valeur **no_gamumail** alors l'envoi est annulé
Exemple d'option à insérer dans un select sélecteur de slug : Exemple d'option à insérer dans un select sélecteur de slug :
```html ```html
<option value="no_gamumail"[ (#ENV{slug}|=={no_gamumail}|oui) selected="selected"]><:souscriptions:pas_de_mail_auto:></option> <option
value="no_gamumail"
[
(#ENV{slug}|=""
="{no_gamumail}|oui)"
selected="selected"
]
>
<:souscriptions:pas_de_mail_auto:>
</option>
``` ```
#### argument Tclient #### argument Tclient
l'Argument $Tclient est utilisé pour récupérer des emails dans un ou X autres Objets SPIP 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 #### argument Tpdf : attacher des PDF avec contenu dynamique
- exemple d'appel pour 1 fichier PDF avec son contexte : - exemple d'appel pour 1 fichier PDF avec son contexte :
```html ```html
[(#FORMULAIRE_GAMUMAIL{ [(#FORMULAIRE_GAMUMAIL{ #ENV{slug}, #ENV{email}, '', #ARRAY{ fichier,pdf_guide,
#ENV{slug}, nom,Fiche_guide, contexte,#ARRAY{ id_article,#ENV{id_article},
#ENV{email}, type_guide,#ENV{type_guide,guide} } }, #ENV{redirect}, #ARRAY{
'', id_auteur,#ENV{id_auteur} } })]
#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` 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 : - 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 ```html
[(#FORMULAIRE_GAMUMAIL{ [(#FORMULAIRE_GAMUMAIL{ #ENV{slug}, #ENV{email}, '', #ARRAY{ 0,#ARRAY{
#ENV{slug}, fichier,pdf_guide, nom,Fiche_guide, contexte,#ARRAY{
#ENV{email}, id_article,#ENV{id_article}, type_guide,guide, } }, 1,#ARRAY{ fichier,pdf_guide,
'', nom,Fiche_guide_renfort, contexte,#ARRAY{ id_article,#ENV{id_article},
#ARRAY{ type_guide,guide_renfort, } } }, #ENV{redirect}, #ARRAY{
0,#ARRAY{ id_auteur,#ENV{id_auteur} } })]
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 : /!\ 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 - 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 #### 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 - charger -> $valeurs
* traiter -> $corps (array du message envoyé à facteur) - verifier -> $erreurs
- traiter -> $corps (array du message envoyé à facteur)
Voir **gamumail_fonctions.php** pour les arguments des fonctions de surcharge + exemples Voir **gamumail_fonctions.php** pour les arguments des fonctions de surcharge + exemples
Pour cela, il faut creer une fonction du type (qui utilise les memes arg que les fonctions CVT + premier arg l'Array que l'on veut modifier) Pour 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. La surcharge pour tous les slugs (`gamumail_tous_...`) précède celle spécifique par slug : on peut donc utiliser les 2 successivement.
Syntaxe : 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 : - 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_NOM_SLUG_charger($valeurs, $options = []){ function gamumail_NOM_SLUG_charger($valeurs, $options = []){
return $valeurs; return $valeurs;
} }
``` ```
* 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 : - 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_NOM_SLUG_verifier($erreurs, $options = []){ function gamumail_NOM_SLUG_verifier($erreurs, $options = []){
return $erreurs; return $erreurs;
} }
``` ```
* 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: - 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_NOM_SLUG_traiter($corps, $options = []){ function gamumail_NOM_SLUG_traiter($corps, $options = []){
if (array_key_exists('id_article', $options)) { if (array_key_exists('id_article', $options)) {
@ -214,8 +224,11 @@ function gamumail_NOM_SLUG_traiter($corps, $options = []){
return $corps; return $corps;
} }
``` ```
#### 3. Pipeline remplacements_slug pour le traitement du contenu des messages #### 3. Pipeline remplacements_slug pour le traitement du contenu des messages
Pour les remplacements des @@ et tout autre traitement du texte des mails on utilisera le pipeline **remplacements_slug** qui utilise les arguments suivants : Pour les remplacements des @@ et tout autre traitement du texte des mails on utilisera le pipeline **remplacements_slug** qui utilise les arguments suivants :
```php ```php
* @param array $flux données du pipeline : * @param array $flux données du pipeline :
* $flux['data'] = $html * $flux['data'] = $html
@ -250,27 +263,35 @@ Pour les remplacements des @@ et tout autre traitement du texte des mails on uti
} }
``` ```
#### 4. Pipeline post_gamumail_ok #### 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. 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 #### 5. Ajouter un header / footer dans le content html
on peut définir un header / footer pour les 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/html_header.html => header pour tous les mails
* gamumail/SLUG_html_header.html => pour les mails du modele SLUG - gamumail/html_footer.html => footer pour tous les mails
* gamumail/SLUG_html_footer.html => pour les mails du modele SLUG - 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 #### 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 - 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 - 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` - 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 - 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. 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` => voir le code en commentaire dans le fichier `inclure/fermer_modale`
## API d'envoi de mails utilisant les slugs ## API d'envoi de mails utilisant les slugs
### fonction envoyer_gamumail() ### fonction envoyer_gamumail()
- exemple d'appel : - exemple d'appel :
```php ```php
$fonction = charger_fonction('envoyer_gamumail','inc'); $fonction = charger_fonction('envoyer_gamumail','inc');
$options = [ $options = [
@ -286,7 +307,9 @@ $options = [
]; ];
$fonction(lire_config('souscriptions/slug_souscription_validation'), $Tdest, $options); $fonction(lire_config('souscriptions/slug_souscription_validation'), $Tdest, $options);
``` ```
- arguments : - arguments :
```php ```php
* @param string $slug * @param string $slug
* @param string|array $destinataires = adresses mails et id_auteur séparées par , ou en array * @param string|array $destinataires = adresses mails et id_auteur séparées par , ou en array
@ -303,13 +326,27 @@ $fonction(lire_config('souscriptions/slug_souscription_validation'), $Tdest, $op
* 'nom' => 'nom_fichier_attache' ] * '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 ## Outrepasser l'erreur de certificat auto-signé lors de devs en https local
=> dans le mes_options.php du site mettre : => dans le mes_options.php du site mettre :
``` ```php
define('_DEBUG_AUTORISER', true); define('_DEBUG_AUTORISER', true);
``` ```
ce qui permet d'activer les options de curl pour ne pas vérifier le certificat dans *charger_pdf.php* :
``` ce qui permet d'activer les options de curl pour ne pas vérifier le certificat dans _charger_pdf.php_ :
```php
// pour une connexion https locale avec certificat auto-signé // pour une connexion https locale avec certificat auto-signé
if (defined('_DEBUG_AUTORISER')) { if (defined('_DEBUG_AUTORISER')) {
curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYHOST, false);

View file

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

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

View file

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

View file

@ -242,3 +242,31 @@
.formulaire_gamumail .btn { .formulaire_gamumail .btn {
font-size: 3rem; font-size: 3rem;
} }
.gestion_documents {
display:flex;
flex-direction:column;
gap: 20px;
}
.gestion_documents .colonne_droite {
border-bottom: 1px solid #CECECE;
margin-bottom: 20px;
}
.colonne_droite .dropfile{
display: flex;
gap: 5px;
align-items: center;
}
@media (min-width: 780px) {
.gestion_documents {
flex-direction: row;
}
.colonne_gauche {
width: 50%;
}
.colonne_droite {
width: 50%;
order: 2;
}
}

View file

@ -4,9 +4,13 @@
[(#REM) [(#REM)
inclure vide pour surcharge si besoin de passer du JS en fonction du retour du traiter du form inclure vide pour surcharge si besoin de passer du JS en fonction du retour du traiter du form
(voir dans le fichier fermer_modale.html pour exemple permettant de fermer une modalbox contenant ce formulaire + README) (voir inclure/fermer_modale.html pour exemple permettant de fermer une modalbox contenant ce formulaire + README)
]<INCLURE{fond=inclure/fermer_modale,env}> ]<INCLURE{fond=inclure/fermer_modale,env}>
[(#REM)
récupérer la langue du destinataire dans le paramètre options/lang
] #SET{lang_dest, #ENV{options/lang}|sinon{#CONFIG{langue_site}}}
<div class="formulaire_spip formulaire_#FORM"> <div class="formulaire_spip formulaire_#FORM">
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>] [<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
@ -17,7 +21,7 @@
#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}
@ -41,7 +45,7 @@
<label for="#GET{name}_non">Non</label> <label for="#GET{name}_non">Non</label>
</div> </div>
<div class="choix"> <div class="choix">
<input type="radio" class="radio" name="#GET{name}" value="oui" id="#GET{name}_oui"[ (#ENV{#GET{name}}|=={oui}|?{checked="checked"})] > <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> <label for="#GET{name}_oui">Oui</label>
</div> </div>
</div> </div>
@ -89,7 +93,7 @@
#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>
@ -100,77 +104,67 @@
#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><:gamumail:pdf_envoyes:></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|table_valeur{fichier})]_#CLE" id="#GET{name}_#COMPTEUR_BOUCLE" checked="checked" > <input type="text" class="text" name="#GET{name}" value="[(#ENV{#GET{name}})]" id="#GET{name}" >
[(#SET{url_pdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,[(#VALEUR|table_valeur{fichier})]})]})] </div>
<BOUCLE_options(DATA){source tableau, #VALEUR|table_valeur{contexte}}> <B_docs_spip>
[(#SET{url_pdf,[(#GET{url_pdf}|parametre_url{#CLE,#VALEUR})]})] <div class="details_docs_spip">
</BOUCLE_options> <ul>
<label for="#GET{name}_#COMPTEUR_BOUCLE">[(#VALEUR|table_valeur{nom})] : <a href="#GET{url_pdf}">voir le PDF</a></label> <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{name,docs_spip}
<h2><:gamumail:documents_attaches:></h2>
<div class="editer_groupe">
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
<div class="editer editer_[(#GET{name})][ (#GET{erreurs}|oui)erreur]">
<div class="choix">
[<span class="erreur_message">(#GET{erreurs})</span>]
<label for="#GET{name}"><:gamumail:id_docs_attaches:></label>
<input type="text" class="text" name="#GET{name}" value="[(#ENV{#GET{name}})]" id="#GET{name}" >
</div>
<B_docs_spip>
<div class="details_docs_spip">
<ul>
<BOUCLE_docs_spip(DOCUMENTS){id_document IN #ENV{#GET{name}}|explode{','}}>
<li><strong>#ID_DOCUMENT :</strong> #TITRE ([<a class="mediabox" href="#URL_DOCUMENT">(#FICHIER|basename)</a>])</li>
</BOUCLE_docs_spip>
</ul>
</div>
</B_docs_spip>
</div>
</div>
</B_doc>
#SET{fichier,all_fichiers} <hr>
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui) <div class="boutons text-center">
#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 class="boutons">
<button type="submit" class="btn"><:gamumail:envoyer:></button> <button type="submit" class="btn"><:gamumail:envoyer:></button>
</div> </div>
</div></form> </div></form>

View file

@ -13,7 +13,8 @@ include_spip('inc/filtres');
* de la forme []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email', 'copie' => 'cc|cci'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] * de la forme []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email', 'copie' => 'cc|cci'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email']
* le paramètre 'copie' est facultatif : cc ou cci pour mettre un destinataire en copie, '' par défaut = destinataire principal * 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) * @param array $Tpdf = un ou plusieurs fichiers PDF générés par spiPDF (le contexte permet la personnalisation du contenu)
* []['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] ou ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] * []['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3, 'lang' => 'en']] ou ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3, 'lang' => 'en']]
* NB: si besoin que le PDF généré soit dans une langue précise, il faut passer la passer en paramètre "lang" dans le contexte
* @param string $redirect * @param string $redirect
* @param array $options = un gros fourre-tout sous forme d'un array * @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 * utilisé en particulier par les inclure HTML de gamumail/#SLUG_soustexte et gamumail/#SLUG_fichiers
@ -26,6 +27,7 @@ function formulaires_gamumail_charger_dist($slug, $destinataires = 0, $Tclient =
$Tcc = lire_config('gamumail/mail_cc') !== '' ? explode(',', lire_config('gamumail/mail_cc', '')) : []; $Tcc = lire_config('gamumail/mail_cc') !== '' ? explode(',', lire_config('gamumail/mail_cc', '')) : [];
$Tcci = lire_config('gamumail/mail_cci') !== '' ? explode(',', lire_config('gamumail/mail_cci', '')) : []; $Tcci = lire_config('gamumail/mail_cci') !== '' ? explode(',', lire_config('gamumail/mail_cci', '')) : [];
$Trepondre_a = lire_config('gamumail/mail_repondre_a') !== '' ? explode(',', lire_config('gamumail/mail_repondre_a', '')) : []; $Trepondre_a = lire_config('gamumail/mail_repondre_a') !== '' ? explode(',', lire_config('gamumail/mail_repondre_a', '')) : [];
if (!empty($destinataires) and !is_array($destinataires)) { if (!empty($destinataires) and !is_array($destinataires)) {
@ -74,11 +76,31 @@ function formulaires_gamumail_charger_dist($slug, $destinataires = 0, $Tclient =
} }
} }
$gamuMail = sql_fetsel('sujet, texte, id_docs', 'spip_gamumails', 'slug='.sql_quote($slug)); $TFichierPdf = pipeline('gamumail_filtrer_tPDF', [
'args' => [
'TFichierPdf' => $TFichierPdf
],
'data' => $TFichierPdf
]
);
$gamuMail = [];
if (!empty($slug)) {
$gamuMail = sql_fetsel('sujet, texte, id_docs', 'spip_gamumails', 'slug='.sql_quote($slug));
}
$texte = $gamuMail['texte'] ?? '';
$sujet = $gamuMail['sujet'] ?? '';
// faire les remplacement <multi> selon la langue du destinataire (passée en $options[lang])
if (!empty($options['lang']) && in_array($options['lang'], liste_options_langues('var_lang'))) {
$texte = extraire_multi($texte, $options['lang']);
$sujet = extraire_multi($sujet, $options['lang']);
}
$valeurs = array( $valeurs = array(
"slug" => $slug, "slug" => $slug,
'sujet' => $gamuMail['sujet'] ?? '', 'sujet' => $sujet,
'texte' => $gamuMail['texte'] ?? '', 'texte' => $texte,
'pour' => implode(',', $Tmails), 'pour' => implode(',', $Tmails),
'cc' => implode(',', $Tcc), 'cc' => implode(',', $Tcc),
'cci' => implode(',', $Tcci), 'cci' => implode(',', $Tcci),
@ -99,13 +121,17 @@ function formulaires_gamumail_charger_dist($slug, $destinataires = 0, $Tclient =
$valeurs = $f($valeurs, $options, $slug, $destinataires, $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, $destinataires = 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';
} }
@ -184,6 +210,21 @@ function formulaires_gamumail_verifier_dist($slug, $destinataires = 0, $Tclient
$erreurs = $f($erreurs, $options, $slug, $destinataires, $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;
} }
@ -220,12 +261,22 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
} }
} }
/*
* 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)) { if (empty($envoi_separe)) {
gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, $retour); gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $Tfiles, $redirect, $retour);
} else { } else {
$ok = true; $ok = true;
foreach ($destinataires as $d) { foreach ($destinataires as $d) {
$r = gamuSend($slug, $options, [$d], $Tclient, $Tpdf, $redirect); $r = gamuSend($slug, $options, [$d], $Tclient, $Tpdf, $Tfiles, $redirect);
if (!$r) { if (!$r) {
$ok = false; $ok = false;
} }
@ -250,14 +301,16 @@ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient =
} }
function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, &$retour = []) { function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $Tfiles, $redirect, &$retour = []) {
$cc = _request('cc'); $cc = _request('cc') ?? '';
$cci = _request('cci'); $cci = _request('cci') ?? '';
$repondre_a = _request('repondre_a'); $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); $repondre_a = explode(',', $repondre_a);
$sujet = _request('sujet'); $sujet = _request('sujet');
@ -303,7 +356,9 @@ function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, &
'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
]; ];
} }
} }
@ -324,10 +379,33 @@ function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, &
'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_doc
]; ];
} }
} }
// les documents par tFiles (téléversés)
$tFilename = [];
if (!empty($Tfiles)) {
include_spip('inc/documents');
$rep = sous_repertoire(_DIR_CACHE . 'bigform');
foreach ($Tfiles as $fichier) {
$filename = $rep . $fichier['name'];
$tFilename[] = $filename;
deplacer_fichier_upload($fichier['tmp_name'], $filename);
$pieces_jointes[] = [
'chemin' => $filename,
'nom' => $fichier['name'],
'encodage' => 'base64',
'mime' => $fichier['type'],
'quoi' => 'televerser',
'qui' => $fichier['name']
];
}
}
// les pdfs générés en fonction du contexte // les pdfs générés en fonction du contexte
$Tpdf_del = []; $Tpdf_del = [];
if (!empty($Tpdfs_ok) and is_array($Tpdfs_ok)) { if (!empty($Tpdfs_ok) and is_array($Tpdfs_ok)) {
@ -359,17 +437,21 @@ function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, &
], 'data' => $c ], 'data' => $c
]); ]);
$pdf = $recup_pdf($fichier, $c); $pdf = $recup_pdf($fichier, $c, $args);
$nom_fichier = $nom.'.pdf'; if (!empty($pdf)) {
$destination = _DIR_TMP.basename($nom_fichier); $nom_fichier = $nom.'.pdf';
$Tpdf_del[] = $destination; $destination = _DIR_TMP.basename($nom_fichier);
file_put_contents($destination,$pdf); $Tpdf_del[] = $destination;
$pieces_jointes[] = [ file_put_contents($destination,$pdf);
'chemin' => $destination, $pieces_jointes[] = [
'nom' => $nom_fichier, 'chemin' => $destination,
'encodage' => 'base64', 'nom' => $nom_fichier,
'mime' => 'application/pdf' 'encodage' => 'base64',
]; 'mime' => 'application/pdf',
'quoi' => 'pdf_genere',
'qui' => $fichier
];
}
} }
} }
@ -402,7 +484,7 @@ function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, &
} }
$html = $html_header . $html . $html_footer; $html = $html_header . $html . $html_footer;
// pipeline pour les traitement du contenu des slugs spécifiques de chaque plugin // pipeline pour les traitements du contenu des slugs spécifiques de chaque plugin
$html = pipeline('remplacements_slug', array( $html = pipeline('remplacements_slug', array(
'args' => $args, 'args' => $args,
'data' => $html 'data' => $html
@ -418,13 +500,13 @@ function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, &
'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) { if ($repondre_a) {
$corps['repondre_a'] = $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) // 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, $destinataires, $Tclient, $Tpdf, $redirect); $corps = $f($corps, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect);
@ -441,12 +523,32 @@ function gamuSend($slug, $options, $destinataires, $Tclient, $Tpdf, $redirect, &
]); ]);
$sujet = $remplacement_generiques($args, $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['corps'] = $corps;
$args['sujet'] = $sujet; $args['sujet'] = $sujet;
// envoyer ! // envoyer !
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/'); $envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
//var_dump($destinataires);
//var_dump($corps);
$ok = $envoyer_mail($destinataires, $sujet, $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 : ","gamumail"); spip_log("Erreur d'envoi du mail : ","gamumail");
spip_log($corps,"gamumail"); spip_log($corps,"gamumail");

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

@ -28,7 +28,7 @@ function gamumail_upgrade($nom_meta_base_version, $version_cible) {
$maj['create'] = array( $maj['create'] = array(
array('maj_tables', array('spip_gamumails')), array('maj_tables', array('spip_gamumails')),
array('creer_compte_curl') array('creer_compte_curl', 'creer_slugs'),
); );
$maj['1.0.2'] = array(array('maj_tables', array('spip_gamumails'))); $maj['1.0.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'));
@ -37,14 +37,54 @@ function gamumail_upgrade($nom_meta_base_version, $version_cible) {
$maj['1.0.12'] = array(array('creer_compte_curl')); $maj['1.0.12'] = array(array('creer_compte_curl'));
$maj['1.0.14'] = array(array('maj_tables', array('spip_gamumails'))); $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.16'] = array(array('maj_tables', array('spip_gamumails')));
$maj['1.0.17'] = array(array('creer_slugs'));
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(){ function creer_compte_curl(){
if (sql_countsel('nom', 'spip_auteurs', 'nom="curl_login"')){ if (sql_countsel('spip_auteurs', 'nom="curl_login"')){
return; return;
} }
$mdp = uniqid(uniqid(),1); $mdp = uniqid(uniqid(),1);

View file

@ -31,5 +31,9 @@ $GLOBALS['remplacements_gamumail'] = [
'@@nom@@' => _T('gamumail:nom'), '@@nom@@' => _T('gamumail:nom'),
'@@prenom@@' => _T('gamumail:prenom_sinon_nom'), '@@prenom@@' => _T('gamumail:prenom_sinon_nom'),
'@@url_site@@' => _T('gamumail:url_site'), '@@url_site@@' => _T('gamumail:url_site'),
'@@nom_site@@' => _T('gamumail:nom_site'),
'@@url_raz_passe@@' => _T('gamumail:url_raz_passe'), '@@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

@ -3,29 +3,7 @@ if (!defined('_ECRIRE_INC_VERSION')){
return; return;
} }
function inc_charger_pdf_dist($fichier_pdf, $contexte = []){ function inc_charger_pdf_dist($fichier_pdf, $contexte = [], $args = []){
$f = charger_fonction('generer_pdf','gamu');
$login = lire_config('curl_login'); return $f($fichier_pdf, $contexte);
$password = lire_config('curl_mdp');
$contexte['spipdf'] = $contexte['spipdf'] ?? $fichier_pdf ;
$url = generer_url_public('spipdf', $contexte, true, false);
$CurlConnect = curl_init();
// pour une connexion https locale avec certificat auto-signé
if (defined('_DEBUG_AUTORISER')) {
curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYPEER, false);
}
curl_setopt($CurlConnect, CURLOPT_URL, $url);
curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1 );
//curl_setopt($CurlConnect, CURLOPT_POSTFIELDS, $request);
curl_setopt($CurlConnect, CURLOPT_USERPWD, $login.':'.$password);
$retour = curl_exec($CurlConnect);
if( ! $retour = curl_exec($CurlConnect)) {
trigger_error(curl_error($CurlConnect));
}
curl_close($CurlConnect);
return $retour;
} }

View file

@ -14,7 +14,7 @@ if (!defined('_ECRIRE_INC_VERSION')){
* $options['cci' => true] pour passer les destinataires en cci si il y en a plus qu'un * $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 * $options['dest_cci' => 'toto@truc.tld'] le destinataire (to) si $options['cci'] === true
* (sinon c'est le compte expéditeur du site) * (sinon c'est le compte expéditeur du site)
* $options['pdfs' => [...]] array des fichiers PDF générés à attacher dont les éléments peuvent être : * $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 nom de squelette PDF
* - soit un array avec 3 éléments (seul le 1er est obligatoire): * - soit un array avec 3 éléments (seul le 1er est obligatoire):
* [ 'fichier' => 'squelette_PDF', * [ 'fichier' => 'squelette_PDF',
@ -32,7 +32,7 @@ if (!defined('_ECRIRE_INC_VERSION')){
* *
*/ */
function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_piece_jointe = []) { function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_piece_jointe = []) {
//var_dump($options) ; //var_dump($options) ;die;
//var_dump($destinataires); //var_dump($destinataires);
include_spip('inc/texte'); include_spip('inc/texte');
@ -53,16 +53,28 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_pie
return $retour; return $retour;
} }
// contenus du slug // langue (par défaut langue du site)
$res = sql_fetsel('*', 'spip_gamumails', 'slug = "'.$slug.'"'); $lang = !empty($options['lang']) ? $options['lang'] : lire_config('langue_site', 'fr');
if ($res) { $id_docs = '';
$sujet = $res['sujet']; if ($slug === 'no_slug' && array_key_exists('message', $options)) {
$html = propre($res['texte']); $html = $options['message'];
$id_docs = $res['id_docs']; if (array_key_exists('sujet', $options)) {
} $sujet = $options['sujet'];
else { } else {
$retour['message_erreur'] = _T("gamumail:pas_de_slug"); $sujet = array_shift($html);
return $retour; }
} 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 // destinataires (id_auteur ou mails) => $pour[] est un array avec les adresses mails valides
@ -84,8 +96,10 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_pie
$non_vide = function ($elem) { $non_vide = function ($elem) {
return ($elem != NULL AND $elem != ''); return ($elem != NULL AND $elem != '');
}; };
$cc = array_filter(explode(',', lire_config('gamumail/mail_cc')), $non_vide); $cc = array_filter(explode(',', (lire_config('gamumail/mail_cc') ?? '')), $non_vide);
$cci = array_filter(explode(',', lire_config('gamumail/mail_cci')), $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 // 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']) { if (count($pour) > 1 AND isset($options['cci']) AND $options['cci']) {
@ -182,20 +196,20 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_pie
$nom = array_key_exists('nom', $pdf) ? $pdf['nom'] : $pdf; $nom = array_key_exists('nom', $pdf) ? $pdf['nom'] : $pdf;
} }
else break; else break;
}
$recup_pdf = charger_fonction('charger_pdf','inc'); $recup_pdf = charger_fonction('charger_pdf','inc');
$pdf = $recup_pdf($sq_pdf, $contexte); $pdf = $recup_pdf($sq_pdf, $contexte);
$nom_fichier = $nom.'.pdf'; $nom_fichier = $nom.'.pdf';
$destination = _DIR_TMP.basename($nom_fichier); $destination = _DIR_TMP.basename($nom_fichier);
$Tpdf_dell[] = $destination; $Tpdf_dell[] = $destination;
file_put_contents($destination,$pdf); file_put_contents($destination,$pdf);
$pieces_jointes[] = [ $pieces_jointes[] = [
'chemin' => $destination, 'chemin' => $destination,
'nom' => $nom_fichier, 'nom' => $nom_fichier,
'encodage' => 'base64', 'encodage' => 'base64',
'mime' => 'application/pdf' 'mime' => 'application/pdf'
]; ];
}
} }
} }
@ -219,15 +233,14 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_pie
$args = $options; $args = $options;
$args['slug'] = $slug; $args['slug'] = $slug;
$args['destinataires'] = $pour; $args['destinataires'] = $pour;
//var_dump($args) ;
$html = pipeline('remplacements_slug', array( $html = pipeline('remplacements_slug', [
'args' => $args, 'args' => $args,
'data' => $html 'data' => $html
)); ]);
$sujet = pipeline('remplacements_slug',[ $sujet = pipeline('remplacements_slug',[
'args' => $args, 'args' => $args,
'data' => $sujet 'data' => $sujet
]); ]);
// traitement des remplacements génériques fournis par Gamumail // traitement des remplacements génériques fournis par Gamumail
@ -235,6 +248,10 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_pie
$html = $remplacement_generiques($args, $html); $html = $remplacement_generiques($args, $html);
$sujet = $remplacement_generiques($args, $sujet); $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'); include_spip('facteur_fonctions');
$texte = facteur_mail_html2text($html); $texte = facteur_mail_html2text($html);
$corps = [ $corps = [
@ -265,12 +282,11 @@ function inc_envoyer_gamumail($slug, $destinataires, $options = [], $Tid_doc_pie
echo '<br>$corps : '; echo '<br>$corps : ';
var_dump($corps); var_dump($corps);
$ok = true; $ok = true;
exit; //exit;
} } else {
else {
// pour ne pas avoir de warning de la fonction envoyer_mail() on doit lui passer un paramètre $from et un $header // pour ne pas avoir de warning de la fonction envoyer_mail() on doit lui passer un paramètre $from et un $header
$from = ''; $from = '';
$header = ''; $header = $options['header'] ?? '';
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/'); $envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
$ok = $envoyer_mail($pour, $sujet, $corps, $from, $header); $ok = $envoyer_mail($pour, $sujet, $corps, $from, $header);
} }

View file

@ -13,6 +13,40 @@ if (!defined('_ECRIRE_INC_VERSION')) {
* *
**/ **/
function inc_gamumail_remplacements_dist($args, $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@@ => $nom ou un espace pour vider le champ @@nom@@
**/ **/
@ -36,12 +70,24 @@ function inc_gamumail_remplacements_dist($args, $html) {
$url_site = lire_config('adresse_site'); $url_site = lire_config('adresse_site');
$html = gamumail_remplacer_modele('url_site', $url_site, $html); $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 de la page de récupération de mot de passe
**/ **/
$url_raz_passe = url_absolue(generer_url_public('spip_pass')); $url_raz_passe = url_absolue(generer_url_public('spip_pass'));
$html = gamumail_remplacer_modele('url_raz_passe', $url_raz_passe, $html); $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; return $html;
} }

View file

@ -80,7 +80,7 @@
<div class="une_conf"> <div class="une_conf">
<small class="name_config">gamumail/mail_cc</small> <small class="name_config">gamumail/mail_cc</small>
<h4><:gamumail:email_en_cc:></h4> <h4><:gamumail:email_en_cc:></h4>
<div class="#EDIT{meta-gamumail/mail_cc} inbl w600p">[(#CONFIG{gamumail/mail_cc}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div> <div class="#EDIT{meta-gamumail/mail_cc} inbl w600p nomulti">[(#CONFIG{gamumail/mail_cc}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div>
<p class="explication"><:gamumail:plusieurs_mails_separer_virgule:>.</p> <p class="explication"><:gamumail:plusieurs_mails_separer_virgule:>.</p>
</div> </div>
</div> </div>
@ -88,7 +88,7 @@
<div class="une_conf"> <div class="une_conf">
<small class="name_config">gamumail/mail_cci</small> <small class="name_config">gamumail/mail_cci</small>
<h4><:gamumail:email_en_cci:></h4> <h4><:gamumail:email_en_cci:></h4>
<div class="#EDIT{meta-gamumail/mail_cci} inbl w600p">[(#CONFIG{gamumail/mail_cci}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div> <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> <p class="explication"><:gamumail:plusieurs_mails_separer_virgule:>.</p>
</div> </div>
@ -114,7 +114,7 @@
<div class="objet--slug"> <div class="objet--slug">
<strong><:gamumail:slug:>: </strong> <strong><:gamumail:slug:>: </strong>
[(#AUTORISER{modifier_nom_slug, gamumail, #ID_GAMUMAIL}|?{ [(#AUTORISER{modifier_nom_slug, gamumail, #ID_GAMUMAIL}|?{
<span class="[(#EDIT{nom_slug})]">[(#SLUG|sinon{<:gamumail:dbe_clic_editer:>})]</span> <span class="[(#EDIT{nom_slug})] nomulti">[(#SLUG|sinon{<:gamumail:dbe_clic_editer:>})]</span>
, ,
<span class="">[(#SLUG)]</span> <span class="">[(#SLUG)]</span>
})] })]
@ -131,14 +131,17 @@
</div> </div>
<div class="objet--mail"> <div class="objet--mail">
<span><strong><:gamumail:documents_attaches:> :</strong> <em class="explication"><:gamumail:liste_id_separes:> , </em></span> <span><strong><:gamumail:documents_attaches:> :</strong> <em class="explication"><:gamumail:liste_id_separes:> , </em></span>
<div class="texte #EDIT{id_docs}"> <div class="texte #EDIT{id_docs} nomulti">
[(#ID_DOCS|sinon{<:gamumail:dbe_clic_editer:>})] [(#ID_DOCS|sinon{<:gamumail:dbe_clic_editer:>})]
</div> </div>
<B_docs_spip> <B_docs_spip>
<div class="details_docs_spip"> <div class="details_docs_spip">
<ul> <ul>
<BOUCLE_docs_spip(DOCUMENTS){id_document IN #ID_DOCS|explode{','}}{tous}> <BOUCLE_docs_spip(DOCUMENTS){id_document IN #ID_DOCS|explode{','}}{tous}>
<li><strong>#ID_DOCUMENT :</strong> #TITRE ([<a class="mediabox" href="#URL_DOCUMENT">(#FICHIER|basename)</a>])</li> <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> </BOUCLE_docs_spip>
</ul> </ul>
</div> </div>

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>

112
lang/gamumail_en.php Normal file
View file

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

View file

@ -21,11 +21,14 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'choix_slug' => 'Choix du modèle', 'choix_slug' => 'Choix du modèle',
'contenu_mail' => 'Contenu du mail', 'contenu_mail' => 'Contenu du mail',
'creer_modele' => 'Créer un modèle de mail', 'creer_modele' => 'Créer un modèle de mail',
'corps_message' => 'Texte',
// D // D
'documents_attaches' => 'Documents attachés', 'documents_attaches' => 'Documents attachés',
'dbe_clic_editer' => 'Double clic pour éditer', 'dbe_clic_editer' => 'Double clic pour éditer',
'dbe_clic_editer_champs' => 'Double clic pour éditer les champs des modèles.', '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',
@ -38,6 +41,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// F // F
'fichiers_annexes' => 'Fichiers annexes', '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',
@ -84,6 +88,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
'selectionnez_modele' => 'Sélectionnez un modèle...', 'selectionnez_modele' => 'Sélectionnez un modèle...',
'supprimer_modele' => 'Supprimer le modèle', 'supprimer_modele' => 'Supprimer le modèle',
'slug' => 'Slug', 'slug' => 'Slug',
'sujet' => 'Sujet',
'switch_modele_public' => 'Modifier la visibilité publique du modèle', 'switch_modele_public' => 'Modifier la visibilité publique du modèle',
// T // T
@ -101,6 +106,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array(
// U // U
'url_site' => 'URL du site', 'url_site' => 'URL du site',
'url_raz_passe' => 'URL de la page de récupération de mot de passe', '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 // V
'visibilite_public' => 'Disponible dans la liste des modèles', '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.2.0" version="1.4.6"
etat="dev" etat="dev"
compatibilite="[3.2.0;4.1.*]" 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.16" schema="1.0.17"
> >
<nom>GamuMail</nom> <nom>GamuMail</nom>
@ -15,13 +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="remplacements_slug" action='' />
<pipeline nom="post_gamumail_ok" action='' /> <pipeline nom="post_gamumail_ok" action='' />
<pipeline nom="tpdf_charger_contexte" 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" />