This commit is contained in:
Christophe 2021-04-13 15:58:42 +02:00
commit 2a99d36d52
30 changed files with 1142 additions and 192 deletions

110
README.md
View file

@ -1,5 +1,5 @@
# 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 * Pour
* Cc en meta : **gamumail/mail_cc** * Cc en meta : **gamumail/mail_cc**
@ -13,9 +13,9 @@
## Il gere des modèles de contenu pour : ## Il gere des modèles de contenu pour :
* Sujet * Sujet
* Texte * 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
* Chaque modèle à un identifiant textuel : **slug** qui doit etre unique. Il ne peut etre creer / modifié QUE par les webmestres
* Pour gerer ses modèles, il faut inclure dans une page : * Pour gerer ses modèles, il faut inclure dans une page :
```html ```html
<INCLURE{fond=inclure/gamumail_config,env}> <INCLURE{fond=inclure/gamumail_config,env}>
@ -48,8 +48,29 @@ ex de fichier :
* gamumail/SLUG_soustexte.html -> sous le contenu du mail, avant les pièces jointes * gamumail/SLUG_soustexte.html -> sous le contenu du mail, avant les pièces jointes
* gamumail/SLUG_fichier.html -> à la fin du formulaire * gamumail/SLUG_fichier.html -> à la fin du formulaire
### aide à la rédaction du contenu:
- le fichier **gamumail/remplacement_slugs.html** (surchargeable donc) 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**
(= ceux fournis par le pipeline **remplacement_slugs**, cf ci-dessous)
- 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
@ -57,15 +78,16 @@ ex de fichier :
* 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 = []){
@ -79,6 +101,8 @@ Pour chaque étape, on peut modifier l'Array de sortie :
* verifier -> $erreurs * verifier -> $erreurs
* traiter -> $corps (array du message envoyé à facteur) * traiter -> $corps (array du message envoyé à facteur)
Voir **gamumail_fonctions.php** pour les arguments des fonctions de surcharge + exemples
Pour cela, il faut creer une fonction du type (qui utilise les memes arg que les fonctions CVT + premier arg l'Array que l'on veut modifier): Pour cela, il faut creer une fonction du type (qui utilise les memes arg que les fonctions CVT + premier arg l'Array que l'on veut modifier):
* pour charger : **gamumail/charger.php** pour tous les formulaires ou * pour charger : **gamumail/charger.php** pour tous les formulaires ou
* pour charger : **gamumail/SLUG_charger.php** avec une fonction : * pour charger : **gamumail/SLUG_charger.php** avec une fonction :
@ -94,7 +118,6 @@ function gamumail_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 : **gamumail/SLUG_traiter.php** avec une fonction ex:
```php ```php
function gamumail_contrat_resa_traiter($corps, $options = []){ function gamumail_contrat_resa_traiter($corps, $options = []){
@ -117,11 +140,70 @@ function gamumail_contrat_resa_traiter($corps, $options = []){
return $corps; return $corps;
} }
``` ```
#### 3. Pipeline remplacements_slug pour le traitement du contenu des messages
Pour les remplacements des @@ et tout autre traitement du texte des mails on utilisera le pipeline **remplacements_slug** qui utilise les arguments suivants :
```php
* @param array $flux données du pipeline :
* $flux['data'] = $html
* $flux['args']['slug'] = $slug
* $flux['args']['destinataires'] = $destinataires
* $flux['args']['options'] = $options
* @return array $flux données du pipeline
```
#### 3. Ajouter un header / footer dans notre content html #### 4. 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_header.html => header pour tous les mails
* gamumail/html_footer.html => footer 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_header.html => pour les mails du modele SLUG
* gamumail/SLUG_html_footer.html => pour les mails du modele SLUG * gamumail/SLUG_html_footer.html => pour les mails du modele SLUG
## API d'envoi de mails utilisant les slugs
### fonction envoyer_gamumail()
- exemple d'appel :
```php
$fonction = charger_fonction('envoyer_gamumail','inc');
$options = [
'debug' => false,
'args' => ['nb_parts' => intval(_request('nombre'))],
'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' ]
```
## Outrepasser l'erreur de certificat auto-signé lors de devs en https local
=> dans le mes_options.php du site mettre :
```
define('_DEBUG_AUTORISER', true);
```
ce qui permet d'activer les options de curl pour ne pas vérifier le certificat dans *charger_pdf.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);
}
```

39
action/creer_slug.php Normal file
View file

@ -0,0 +1,39 @@
<?php
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* créer un slug Gamumail
*
* @plugin GamuMail
*
* @copyright 2020
* @author cy_altern
* @licence GNU/GPL
*
**/
include_spip('inc/editer');
include_spip('action/editer_objet');
include_spip('inc/autoriser');
function action_creer_slug_dist(){
include_spip('inc/autoriser');
if (!autoriser('creer','gamumail')) {
return false;
}
$set = [
'slug' => '',
'titre' => 'Le titre du modèle',
'sujet' => 'Le sujet du mail',
'texte' => 'Le texte du mail',
'statut' => 'publie',
];
if ($id_slug = objet_inserer('gamumail', null, $set)) {
sql_updateq('spip_gamumails', ['slug' => 'slug_'.$id_slug], 'id_gamumail = '.$id_slug);
}
// Cache
include_spip('inc/invalideur');
suivre_invalideur("id='id_gamumail/$id_gamumail'");
}

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

@ -52,7 +52,9 @@ function gamumail_declarer_tables_objets_sql($tables) {
'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 ""',
'id_docs' => 'text NOT NULL DEFAULT ""',
'statut' => 'varchar(20) DEFAULT "0" NOT NULL', 'statut' => 'varchar(20) DEFAULT "0" NOT NULL',
'public' => 'varchar(20) DEFAULT "oui" NOT NULL',
'maj' => 'TIMESTAMP' 'maj' => 'TIMESTAMP'
), ),
'key' => array( 'key' => array(

View file

@ -0,0 +1,2 @@
[(#AUTORISER{webmestre}|sinon_interdire_acces)]
<INCLURE{fond=inclure/gamumail_config}{env}>

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}})]

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;
@ -59,7 +59,6 @@
.tag-editor ::-ms-clear { .tag-editor ::-ms-clear {
display: none; display: none;
} }
/* tag style */ /* tag style */
.tag-editor .tag-editor-tag { .tag-editor .tag-editor-tag {
/*padding-left: 5px; color: #46799b; background: #e0eaf1; white-space: nowrap;*/ /*padding-left: 5px; color: #46799b; background: #e0eaf1; white-space: nowrap;*/
@ -72,7 +71,6 @@
cursor: pointer; cursor: pointer;
border-radius: 4px 0 0 4px; border-radius: 4px 0 0 4px;
} }
/* delete icon */ /* delete icon */
/*.tag-editor .tag-editor-delete { background: #e0eaf1; cursor: pointer; border-radius: 0 2px 2px 0; padding-left: 3px; padding-right: 4px; }*/ /*.tag-editor .tag-editor-delete { background: #e0eaf1; cursor: pointer; border-radius: 0 2px 2px 0; padding-left: 3px; padding-right: 4px; }*/
.tag-editor .tag-editor-delete { .tag-editor .tag-editor-delete {
@ -101,7 +99,6 @@
visibility: hidden; visibility: hidden;
cursor: text; cursor: text;
} }
.tag-editor .tag-editor-tag.active { .tag-editor .tag-editor-tag.active {
background: none !important; background: none !important;
} }
@ -150,6 +147,7 @@
display: none; display: none;
} }
/* les styles de gamumails */
.formulaire_gamumail { .formulaire_gamumail {
padding-top: 0; padding-top: 0;
} }
@ -162,17 +160,38 @@
.editer_pour label { .editer_pour label {
width: 50px; width: 50px;
} }
.editer_cc { .editer_cc {
display: flex; display: flex;
} }
.editer_cc label { .editer_cc label {
width: 50px; width: 50px;
} }
.editer_cci { .editer_cci {
display: flex; display: flex;
} }
.editer_cci label { .editer_cci label {
width: 50px; width: 50px;
} }
.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;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 117 KiB

After

Width:  |  Height:  |  Size: 142 KiB

View file

@ -1,11 +1,10 @@
#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"> <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>] [<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</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}}
@ -77,7 +76,7 @@
#SET{name,Tpdfs_ok} #SET{name,Tpdfs_ok}
<B_pdf> <B_pdf>
<h2>Fichiers PDF envoyés</h2> <h2><:gamumail:pdf_envoyes:></h2>
<div class="editer_groupe"> <div class="editer_groupe">
#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}}
#SET{obli,"obligatoire"} #SET{obli,"obligatoire"}
@ -85,59 +84,58 @@
<BOUCLE_pdf(DATA){source tableau, #ENV{TFichierpdfs}}> <BOUCLE_pdf(DATA){source tableau, #ENV{TFichierpdfs}}>
<div class="choix"> <div class="choix">
<input type="checkbox" class="checkbox" name="#GET{name}[]" value="#VALEUR" id="#GET{name}_#COMPTEUR_BOUCLE" checked="checked" > <input type="checkbox" class="checkbox" name="#GET{name}[]" value="#VALEUR" id="#GET{name}_#COMPTEUR_BOUCLE" checked="checked" >
<label for="#GET{name}_#COMPTEUR_BOUCLE">#VALEUR</label> [(#SET{url_pdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,#VALEUR})]})]
<BOUCLE_options(DATA){source tableau, #ENV{options}}>
[(#SET{url_pdf,[(#GET{url_pdf}|parametre_url{#CLE,#VALEUR})]})]
</BOUCLE_options>
<label for="#GET{name}_#COMPTEUR_BOUCLE">#VALEUR : <a href="#GET{url_pdf}">voir le PDF</a></label>
</div> </div>
</BOUCLE_pdf> </BOUCLE_pdf>
</div> </div>
</div> </div>
</B_pdf> </B_pdf>
#SET{id_gamumail,0} #SET{name,docs_spip}
#SET{name,Tid_doc} <h2><:gamumail:documents_attaches:></h2>
<BOUCLE_slug(GAMUMAILS){slug}{tout}> #SET{id_gamumail,#ID_GAMUMAIL} </BOUCLE_slug>
<B_doc>
<h2>Autres Fichiers attachés</h2>
<div class="editer_groupe"> <div class="editer_groupe">
#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]">
<BOUCLE_doc(DOCUMENTS){id_gamumail=#GET{id_gamumail}}>
<div class="choix"> <div class="choix">
<input type="checkbox" class="checkbox" name="#GET{name}[]" value="#ID_DOCUMENT" id="#GET{name}_#ID_DOCUMENT" checked="checked" > [<span class="erreur_message">(#GET{erreurs})</span>]
<label for="#GET{name}_#ID_DOCUMENT">[(#TITRE|sinon{#FICHIER|basename})]</label> <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> </div>
</BOUCLE_doc>
</div> </div>
</div> </div>
</B_doc> </B_doc>
#SET{fichier,#SLUG|concat{_fichiers}} #SET{fichier,#SLUG|concat{_fichiers}}
[(#CHEMIN{gamumail/#GET{fichier}.html}|oui) [(#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}> <INCLURE{fond=gamumail/#GET{fichier},env}>
] ]
<div class="boutons"> <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>
</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();
//onAjaxLoad(gamumail); //onAjaxLoad(gamumail);
function gamumail(){ function gamumail(){
var navigateur = navigator.platform.toUpperCase().slice(0, 3);
if (navigateur !== "MAC") {
$(".tagEditor").tagEditor({ $(".tagEditor").tagEditor({
delimiter: ',; ' delimiter: ',; '
}); });
} }
}
}); });
</script> </script>

View file

@ -1,28 +1,38 @@
<?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'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email']
* @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]]
* @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)) { if (!is_array($destinataires)) {
$Tmails[] = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.intval($auteur)); $destinataires = explode(',', $destinataires);
} elseif (is_string($auteur)) { }
if (email_valide($auteur)) { foreach ($destinataires as $dest) {
$Tmails[] = $auteur; if (is_numeric($dest)) {
if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) {
$Tmails[] = $mail;
}
}
elseif (email_valide($dest)) {
$Tmails[] = $dest;
} }
} }
@ -50,7 +60,7 @@ function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $T
} }
} }
$gamuMail = sql_fetsel('sujet, texte', 'spip_gamumails', 'slug='.sql_quote($slug)); $gamuMail = sql_fetsel('sujet, texte, id_docs', 'spip_gamumails', 'slug='.sql_quote($slug));
$valeurs = array( $valeurs = array(
"slug" => $slug, "slug" => $slug,
'sujet' => $gamuMail['sujet'], 'sujet' => $gamuMail['sujet'],
@ -60,40 +70,104 @@ function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $T
'cci' => lire_config('gamumail/mail_cci'), 'cci' => lire_config('gamumail/mail_cci'),
'TFichierpdfs' => $TFichierPdf, 'TFichierpdfs' => $TFichierPdf,
'Tpdfs_ok' => [], 'Tpdfs_ok' => [],
'Tid_doc' => [], 'docs_spip' => $gamuMail['id_docs'],
'Tid_fichiers' => [],
'options' => $options 'options' => $options
); );
// surcharges charger
if ($f = charger_fonction('charger', 'gamumail', true)) { if ($f = charger_fonction('charger', 'gamumail', true)) {
$valeurs = $f($valeurs, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); $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);
} }
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';
} }
// le slug est il OK ?
if (preg_match('/[^a-zA-Z0-9_\-]/', $slug)) {
$erreurs['message_erreur'] = _T("gamumail:erreur_format_slug");
}
$res = sql_fetsel('slug', 'spip_gamumails', 'slug = "'.$slug.'"');
if (!$res) {
$erreurs['message_erreur'] = _T("gamumail:pas_de_slug");
}
// 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
if ($f = charger_fonction('verifier', 'gamumail', true)) { if ($f = charger_fonction('verifier', 'gamumail', true)) {
$erreurs = $f($erreurs, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); $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);
} }
return $erreurs; return $erreurs;
} }
function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{ function formulaires_gamumail_traiter_dist($slug, $destinataires = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []) :Array{
include_spip('inc/texte'); include_spip('inc/texte');
include_spip('classes/facteur'); include_spip('classes/facteur');
@ -104,27 +178,40 @@ function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $T
$cci = _request('cci'); $cci = _request('cci');
$sujet = _request('sujet'); $sujet = _request('sujet');
$html = propre(_request('texte')); $html = propre(_request('texte'));
$Tid_doc = _request('Tid_doc'); $docs_spip = _request('docs_spip');
$Tpdfs_ok = _request('Tpdfs_ok'); $Tpdfs_ok = _request('Tpdfs_ok');
$Tid_doc = _request('Tid_doc');
$texte = facteur_mail_html2text($html); $texte = facteur_mail_html2text($html);
$pour = explode(',', $pour); $pour = explode(',', $pour);
$cc = explode(',', $cc); $cc = explode(',', $cc);
$cci = explode(',', $cci); $cci = explode(',', $cci);
$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;
}
}
$pieces_jointes = []; $pieces_jointes = [];
if ($f = charger_fonction('traiter_av_pdf', 'gamumail', true)) { if ($f = charger_fonction('traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $auteur, $Tclient, $Tpdf); $options = $f($options, $destinataires, $Tclient, $Tpdf);
} }
if ($f = charger_fonction($slug . '_traiter_av_pdf', 'gamumail', true)) { if ($f = charger_fonction($slug . '_traiter_av_pdf', 'gamumail', true)) {
$options = $f($options, $auteur, $Tclient, $Tpdf); $options = $f($options, $destinataires, $Tclient, $Tpdf);
} }
// les documents joints // les documents par id_document
if (!empty($Tid_doc)) { $docs_spip = ($docs_spip != '' ? explode(',', $docs_spip) : []);
foreach ($Tid_doc as $id_document) { if (!empty($docs_spip)) {
foreach ($docs_spip as $id_document) {
$Tdocument = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_document)); $Tdocument = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_document));
$destination = _DIR_IMG.$Tdocument['fichier']; $destination = _DIR_IMG.$Tdocument['fichier'];
$extension = $Tdocument['extension']; $extension = $Tdocument['extension'];
@ -143,6 +230,27 @@ function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $T
} }
} }
// les documents par Tid_doc envoyés depuis inclure gamumail/#SLUG_fichiers.html
if (!empty($Tid_doc)) {
foreach ($Tid_doc as $id_doc) {
$Tdocs = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_doc));
$destination = _DIR_IMG.$Tdocs['fichier'];
$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
];
}
}
// les pdfs // les pdfs
$Tpdf_dell = []; $Tpdf_dell = [];
if (!empty($Tpdfs_ok) and is_array($Tpdfs_ok)) { if (!empty($Tpdfs_ok) and is_array($Tpdfs_ok)) {
@ -174,22 +282,30 @@ function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $T
} }
$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_header = recuperer_fond('gamumail/html_header', $options);
}
$html_footer = ''; $html_footer = '';
if(find_in_path('gamumail/html_footer.html')){ if (find_in_path('gamumail/'.$slug . '_html_footer.html')) {
$html_footer = recuperer_fond('gamumail/html_footer', $options);
}elseif (find_in_path($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 traitement du contenu des slugs spécifiques de chaque plugin
$args = $options;
$args['slug'] = $slug;
$args['destinataires'] = $destinataires;
$html = pipeline('remplacements_slug', array(
'args' => $args,
'data' => $html
));
$texte = facteur_mail_html2text($html);
$corps = [ $corps = [
'html' => $html, 'html' => $html,
'texte' => $texte, 'texte' => $texte,
@ -198,20 +314,25 @@ function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $T
'pieces_jointes' => $pieces_jointes 'pieces_jointes' => $pieces_jointes
]; ];
/*
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);
} }
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/'); $envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
$ok = $envoyer_mail($pour, $sujet, $corps); $ok = $envoyer_mail($destinataires, $sujet, $corps);
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');
} }
@ -222,15 +343,9 @@ function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $T
} }
} }
if ($redirect) { if ($redirect AND $redirect != '') {
$retour['redirect'] = $redirect; $retour['redirect'] = $redirect;
} }
return $retour; 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,12 @@
[(#REM)
la liste des remplacements joués dans tous les slugs GamuMail (à surcharger par site)
inclure pour la page de configuration des mails
]
<div class="remplacements_slugs">
<h3 class="spip"><:gamumail:remplacements_disponibles:></h3>
<ul class="">
<li><strong>@@exemple_chaine@@</strong> : remplacement de la chaine</li>
</ul>
<em><:gamumail:avertissement_remplacements:></em>
</div>

View file

@ -26,11 +26,25 @@ 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')
);
$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.13'] = array(array('maj_tables', array('spip_gamumails')));
function creer_compte_curl(){ include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
}
function creer_compte_curl(){
if (sql_countsel('nom', 'spip_auteurs', 'nom="curl_login"')){
return;
}
$mdp = uniqid(uniqid(),1); $mdp = uniqid(uniqid(),1);
$set = [ $set = [
'nom' => 'curl_login', 'nom' => 'curl_login',
@ -39,20 +53,14 @@ function gamumail_upgrade($nom_meta_base_version, $version_cible) {
'statut' => '1comite' 'statut' => '1comite'
]; ];
include_spip('action/editer_auteur'); $id_auteur = sql_insertq('spip_auteurs', $set);
$id_auteur = auteur_inserer(null, $set);
if ($id_auteur) { if ($id_auteur) {
include_spip('inc/config'); include_spip('inc/config');
ecrire_config('curl_login', $set['login']); ecrire_config('curl_login', $set['login']);
ecrire_config('curl_mdp', $mdp); ecrire_config('curl_mdp', $mdp);
} }
}
include_spip('base/upgrade');
maj_plugin($nom_meta_base_version, $version_cible, $maj);
} }
/** /**
* Fonction de désinstallation du plugin GamuMail. * Fonction de désinstallation du plugin GamuMail.
* *

View file

@ -24,11 +24,8 @@ function gamumail_autoriser() {
// ----------------- // -----------------
// Objet gamumails // Objet gamumails
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'];
} }
function autoriser_gamumail_voir_dist($faire, $type, $id, $qui, $opt) { function autoriser_gamumail_voir_dist($faire, $type, $id, $qui, $opt) {
@ -36,7 +33,7 @@ function autoriser_gamumail_voir_dist($faire, $type, $id, $qui, $opt) {
} }
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'];
} }
function autoriser_gamumail_supprimer_dist($faire, $type, $id, $qui, $opt) { function autoriser_gamumail_supprimer_dist($faire, $type, $id, $qui, $opt) {
@ -46,3 +43,11 @@ function autoriser_gamumail_supprimer_dist($faire, $type, $id, $qui, $opt) {
function autoriser_gamumail_configurer_dist($faire, $type, $id, $qui, $opt) { function autoriser_gamumail_configurer_dist($faire, $type, $id, $qui, $opt) {
return autoriser('webmestre'); return autoriser('webmestre');
} }
/**
* Autorisation de modifier le nom d'un slug
* uniquement les webmestres avec un mail en @gamuza.fr
**/
function autoriser_gamumail_modifier_nom_slug_dist($faire, $type, $id, $qui, $opt) {
return $qui['webmestre'] === "oui"
and strpos($qui['email'], 'gamuza.fr') !== false;
}

View file

@ -16,3 +16,86 @@ if (!defined('_ECRIRE_INC_VERSION')) {
function gamumail_TabClient($objet, $id_objet, $champ){ function gamumail_TabClient($objet, $id_objet, $champ){
return compact('objet', 'id_objet', 'champ'); return compact('objet', 'id_objet', 'champ');
} }
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'];
$html = str_replace('@@truc_a_remplacer@@', 'le machin qui remplace', $html);
include_spip('classes/facteur');
$texte = facteur_mail_html2text($html);
$corps['html'] = $html;
$corps['texte'] = $texte;
return $corps;
}

View file

@ -13,7 +13,21 @@ 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;
}
@ -26,9 +40,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,22 +3,30 @@ if (!defined('_ECRIRE_INC_VERSION')){
return; return;
} }
function inc_charger_pdf_dist($fichier_pdf, $contexte = []){ function inc_charger_pdf_dist($fichier_pdf, $contexte = []){
$login = lire_config('curl_login'); $login = lire_config('curl_login');
$password = lire_config('curl_mdp'); $password = lire_config('curl_mdp');
$url = $GLOBALS['meta']['adresse_site'].'/spip.php?page=spipdf&spipdf='.$fichier_pdf; $url = $GLOBALS['meta']['adresse_site'].'/spip.php?page=spipdf&spipdf='.$fichier_pdf;
if (is_array($contexte) and count($contexte)) { if (is_array($contexte) and count($contexte)) {
foreach ($contexte as $champ => $val) { foreach ($contexte as $champ => $val) {
if (intval($val)) { /* if (intval($val) === $val) {
// if (intval($val)) {
$val = intval($val); $val = intval($val);
} else { } else {
$val = "$val"; $val = "$val";
} }
*/
$url .= "&$champ=$val"; $url .= "&$champ=$val";
} }
} }
$CurlConnect = curl_init(); $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_URL, $url);
curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1 );
//curl_setopt($CurlConnect, CURLOPT_POSTFIELDS, $request); //curl_setopt($CurlConnect, CURLOPT_POSTFIELDS, $request);

235
inc/envoyer_gamumail.php Normal file
View file

@ -0,0 +1,235 @@
<?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['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' ]
* $options['args' => ['param_1' => 'valeur_1, 'param_2' => 'valeur_2', ...]]
*
**/
function inc_envoyer_gamumail($slug, $destinataires, $options = []) {
include_spip('inc/texte');
include_spip('classes/facteur');
$retour = array();
// sécu
if (preg_match('/[^a-zA-Z0-9_\-]/', $slug)) {
$retour['message_erreur'] = _T("gamumail:erreur_format_slug");
return $retour;
}
// contenus du slug
$res = sql_fetsel('*', 'spip_gamumails', 'slug = "'.$slug.'"');
if ($res) {
$sujet = $res['sujet'];
$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);
// 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));
$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;
}
}
// récup des paramètres des docs à attacher
if (!empty($Tid_doc)) {
foreach ($Tid_doc as $id_document) {
$Tdocument = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_document));
$destination = _DIR_IMG.$Tdocument['fichier'];
$extension = $Tdocument['extension'];
if ($Tdocument['titre']) {
$nom_fichier = $Tdocument['titre'] .".".$extension;
}
else {
$nom_fichier = basename($Tdocument['fichier']);
}
$type_mime = bigup_get_mime_type_extension($extension);
$pieces_jointes[] = [
'chemin' => $destination,
'nom' => $nom_fichier,
'encodage' => 'base64',
'mime' => $type_mime
];
}
}
// 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 traitement du contenu des slugs spécifiques de chaque plugins
$args = $options;
$args['slug'] = $slug;
$args['destinataires'] = $pour;
$html = pipeline('remplacements_slug', array(
'args' => $args,
'data' => $html
));
$texte = facteur_mail_html2text($html);
$corps = [
'html' => $html,
'texte' => $texte,
'cc' => $cc,
'cci' => $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;
}
else {
$envoyer_mail = charger_fonction('envoyer_mail', 'inc/');
$ok = $envoyer_mail($pour, $sujet, $corps);
}
if (!$ok) {
spip_log("Erreur d'envoi du mail : ","gamumail");
spip_log($corps,"gamumail");
$retour['message_erreur'] = _T("gamumail:erreur_envoi_mail");
}
else {
$retour['message_ok'] = _T('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,53 @@
[(#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}>
<option value="#SLUG"[ (#SLUG|=={#ENV{slug}}|oui) selected]>#TITRE</option>
</BOUCLE_slugs>
</select>
</div>
</B_slugs>
<div class="bloc_slug" id="bloc_slug">
<INCLURE{fond=inclure/vue_slug, env, ajax=vue_slug}>
</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,
dest : "#ENV{dest}"
}
//, callback: function(){}
});
});
});
</script>

View file

@ -1,16 +1,18 @@
[(#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%;
} }
.objet--mail {
margin-top: 1.5rem;
}
.well { .well {
background-color: #cecece; background-color: #cecece;
margin: 10px auto; margin: 10px auto;
padding: 10px; padding: 10px;
border-radius: 4px; border-radius: 4px;
.crayon {
background-color: #fff;
}
} }
.un-pdf { .un-pdf {
border: 1px solid black; border: 1px solid black;
@ -21,30 +23,76 @@
display: inline-block; display: inline-block;
width: 180px; width: 180px;
} }
span.crayon, div.crayon {
background-color: #fff;
padding: .5rem;
}
.well h4.crayon {
background-color: #cecece;
}
.wp600 {
width: 600px;
}
.btn_supprimer {
float: right;
}
.btn_editer {
float: right;
margin-right: 2rem;
}
.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;
}
.markItUp .markItUpHeader ul a em {
width: 2rem;
height: 2rem;
}
span > em {
font-size: 85%;
}
.remplacements_slugs {
margin-top: 4rem;
}
</style> </style>
<div class="inner configuration_mails"> <div class="inner configuration_mails">
<h1 class="txtcenter">Configuration des mails</h1>
<div class="configuration_generale"> <div class="configuration_generale">
<div class="well"> <div class="well">
<div class="une_conf"> <div class="une_conf">
<h4>Emails en copie "cc" des différents messages <h4><:gamumail:email_en_cc:></h4>
<span class="#EDIT{meta-gamumail/mail_cc} inbl w600p">[(#CONFIG{gamumail/mail_cc}|sinon{cliquer})]</span> <div class="#EDIT{meta-gamumail/mail_cc} inbl w600p">[(#CONFIG{gamumail/mail_cc}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div>
</h4> <p class="explication"><:gamumail:plusieurs_mails_separer_virgule:> <:gamumail:dbe_clic_editer:>.</p>
<p class="explication">Si plusieurs emails, les séparer par une virgule</p>
</div> </div>
<div class="une_conf"> <div class="une_conf">
<h4>Emails en copie cachée "cci" des différents messages <h4><:gamumail:email_en_cci:></h4>
<span class="#EDIT{meta-gamumail/mail_cci} inbl w600p">[(#CONFIG{gamumail/mail_cci}|sinon{cliquer})]</span> <div class="#EDIT{meta-gamumail/mail_cci} inbl w600p">[(#CONFIG{gamumail/mail_cci}|sinon{<i><:gamumail:dbe_clic_editer:></i>})]</div>
</h4> <p class="explication"><:gamumail:plusieurs_mails_separer_virgule:> <:gamumail:dbe_clic_editer:>.</p>
<p class="explication">Si plusieurs emails, les séparer par une virgule</p>
</div> </div>
<strong class="explication"><:gamumail:dbe_clic_editer_champs:></strong>
</div> </div>
<BOUCLE_message(GAMUMAILS)> <BOUCLE_message(GAMUMAILS)>
<div class="well"> <div class="well">
<div class="une_conf"> <div class="une_conf">
<h4 class="toggle cursor" [(#AUTORISER{supprimer,gamumail}|oui)
<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>
]
<span class="btn btn_editer" title="<:gamumail:editer_titre:>" onClick="$('#h4_#SLUG em.crayon-crayon').trigger('click');"><i class="fa fa-edit"></i></span>
<h4 class="toggle cursor #EDIT{titre}"
id="h4_#SLUG"
data-id="#SLUG"> data-id="#SLUG">
<i class="fa fa-envelope mrs"></i> <i class="fa fa-envelope mrs"></i>
[(#TITRE)] [(#TITRE)]
@ -52,18 +100,45 @@
</h4> </h4>
<div id="#SLUG" class="js-hidden"> <div id="#SLUG" 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}|?{
<span class="#EDIT{slug}">[(#SLUG|sinon{cliquez})]</span> <span class="[(#EDIT{nom_slug})]">[(#SLUG|sinon{<:gamumail:dbe_clic_editer:>})]</span>
,
<span class="">[(#SLUG)]</span>
})]
</div> </div>
]
<div class="objet--mail"> <div class="objet--mail">
<strong>Objet : </strong> <strong><:gamumail:objet:>: </strong>
<span class="#EDIT{sujet}">[(#SUJET|sinon{cliquez})]</span> <span class="#EDIT{sujet}">[(#SUJET|sinon{<:gamumail:dbe_clic_editer:>})]</span>
</div> </div>
<strong>Message : </strong> <div class="objet--mail">
<div class="texte #EDIT{texte}">[(#TEXTE|sinon{cliquez})]</div> <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}">
[(#ID_DOCS|sinon{<:gamumail:dbe_clic_editer:>})]
</div>
</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) [(#REM)
Pour l'instant, inutile Pour l'instant, inutile
<div class="pdfs"> <div class="pdfs">
@ -79,14 +154,16 @@
</div> </div>
</div> </div>
</BOUCLE_message> </BOUCLE_message>
</BOUCLE_messages> [(#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 +175,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>

11
inclure/vue_slug.html Normal file
View file

@ -0,0 +1,11 @@
<h3 id="titre_slug"><:gamumail:contenu_mail:></h3>
<div class="bloc_contenu_slug ajax">
[(#FORMULAIRE_GAMUMAIL{
#ENV{slug},
#ENV{dest},
#ENV{client},
#ENV{Tpdf},
#ENV{redirect},
#ARRAY{}
})]
</div>

View file

@ -10,16 +10,34 @@ $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',
// 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.',
//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
'pdf_envoyes' => 'Fichiers PDF envoyés',
// I // I
'icone_creer_gamumail' => 'Créer un gamumail', 'icone_creer_gamumail' => 'Créer un gamumail',
@ -28,16 +46,40 @@ $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',
// 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.',
// 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',
'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 +92,7 @@ $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',
// 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.0.17"
etat="dev" etat="dev"
compatibilite="[3.3.0-dev;3.3.*]" compatibilite="[3.2.0;3.3.*]"
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.13"
> >
<nom>GamuMail</nom> <nom>GamuMail</nom>
@ -19,6 +19,7 @@
<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;[" />
<pipeline nom="remplacements_slug" 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>