diff --git a/README.md b/README.md index 2ef42dd..8cd3f24 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # gamuMail -> P.O.C pour généraliser un formulaire d'envoi de message +> formulaire d'envoi de messages configurables ## Il gere nativement : * Pour * Cc en meta : **gamumail/mail_cc** @@ -13,9 +13,9 @@ ## Il gere des modèles de contenu pour : * Sujet * Texte +* ID documents joints (spip_documents) --- - -* Chaque modèle à un identifiant textuel : **slug** qui doit etre unique. Il ne peut etre creer / modifié QUE par les webmestres +* Chaque modèle à un identifiant textuel : **slug** qui doit etre unique. Il ne peut etre créé / modifié QUE par les webmestres * Pour gerer ses modèles, il faut inclure dans une page : ```html @@ -48,8 +48,29 @@ ex de fichier : * gamumail/SLUG_soustexte.html -> sous le contenu du mail, avant les pièces jointes * 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)] + + +
+
+

Envoyer un mail à [(#PRENOM|ucfirst) ][(#NOM|ucfirst)]

+ + +
+
+ +``` + ### Dans le php -#### 1. Appel du formualire +#### 1. Appel du formulaire > Args du formulaire : > ```php @@ -57,15 +78,16 @@ ex de fichier : * formulaire générique pour envoyer des mails avec pieces attachés * * @param string $slug modele du mail a charger - * @param int|string $auteur id_auteur ou email du destinataire - * @param array $Tclient []['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]] - * ou - * ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] + * @param string $destinataires = adresses mails et id_auteurs séparées par , ou en array + * si un des destinataire est au format numérique, on considère que c'est un id_auteur et on va choper son mail dans spip_auteurs + * @param array $Tclient = un ou plusieurs mails de destinataires sortis d'une table objet spécifique + * de la forme []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] + * @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 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 */ function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $Tpdf = [], $redirect = '', $options = []){ @@ -78,6 +100,8 @@ Pour chaque étape, on peut modifier l'Array de sortie : * charger -> $valeurs * verifier -> $erreurs * traiter -> $corps (array du message envoyé à facteur) + +Voir **gamumail_fonctions.php** pour les arguments des fonctions de surcharge + exemples Pour cela, il faut creer une fonction du type (qui utilise les memes arg que les fonctions CVT + premier arg l'Array que l'on veut modifier): * pour charger : **gamumail/charger.php** pour tous les formulaires ou @@ -94,7 +118,6 @@ function gamumail_SLUG_verifier($erreurs, $options = []){ return $erreurs; } ``` -* pour traiter : **gamumail/traiter.php** pour tous les formulaires ou * pour traiter : **gamumail/SLUG_traiter.php** avec une fonction ex: ```php function gamumail_contrat_resa_traiter($corps, $options = []){ @@ -117,11 +140,70 @@ function gamumail_contrat_resa_traiter($corps, $options = []){ return $corps; } ``` +#### 3. Pipeline remplacements_slug pour le traitement du contenu des messages +Pour les remplacements des @@ et tout autre traitement du texte des mails on utilisera le pipeline **remplacements_slug** qui utilise les arguments suivants : +```php + * @param array $flux données du pipeline : + * $flux['data'] = $html + * $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 : * gamumail/html_header.html => header pour tous les mails * gamumail/html_footer.html => footer pour tous les mails * gamumail/SLUG_html_header.html => pour les mails du modele SLUG * gamumail/SLUG_html_footer.html => pour les mails du modele SLUG + +## 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); +} +``` diff --git a/action/creer_slug.php b/action/creer_slug.php new file mode 100644 index 0000000..e94b75e --- /dev/null +++ b/action/creer_slug.php @@ -0,0 +1,39 @@ + '', + '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'"); +} diff --git a/action/gamuform_add_pdf.php b/action/gamuform_add_pdf.php index bb5a47a..0ce581a 100644 --- a/action/gamuform_add_pdf.php +++ b/action/gamuform_add_pdf.php @@ -6,17 +6,13 @@ function action_gamuform_add_pdf_dist(){ return false; include_spip('inc/autoriser'); - if (! autoriser("etre","connecte")) { + if (!autoriser('modifier','gamumail')) { return false; } $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); $id_gamumail = $arg; - include_spip('inc/autoriser'); - if (! autoriser("webmestre")) { - return false; - } if (intval($id_gamumail)) { sql_insertq('spip_gamumail_pdfs',['id_gamumail' => intval($id_gamumail)]); diff --git a/action/supprimer_slug.php b/action/supprimer_slug.php new file mode 100644 index 0000000..c2a5c9b --- /dev/null +++ b/action/supprimer_slug.php @@ -0,0 +1,33 @@ + "non"] : ['public' => "oui"]; + sql_updateq('spip_gamumails', $set, 'id_gamumail ='.$id_gamumail); + } + + // Cache + include_spip('inc/invalideur'); + suivre_invalideur("id='id_gamumail/$id_gamumail'"); +} diff --git a/base/gamumail.php b/base/gamumail.php index da0843f..124272c 100644 --- a/base/gamumail.php +++ b/base/gamumail.php @@ -52,7 +52,9 @@ function gamumail_declarer_tables_objets_sql($tables) { 'titre' => 'varchar(255) NOT NULL DEFAULT ""', 'sujet' => 'varchar(255) NOT NULL DEFAULT ""', 'texte' => 'text NOT NULL DEFAULT ""', + 'id_docs' => 'text NOT NULL DEFAULT ""', 'statut' => 'varchar(20) DEFAULT "0" NOT NULL', + 'public' => 'varchar(20) DEFAULT "oui" NOT NULL', 'maj' => 'TIMESTAMP' ), 'key' => array( diff --git a/content/configuration_mails.html b/content/configuration_mails.html new file mode 100644 index 0000000..fb2fba9 --- /dev/null +++ b/content/configuration_mails.html @@ -0,0 +1,2 @@ +[(#AUTORISER{webmestre}|sinon_interdire_acces)] + diff --git a/content/test_slug.html b/content/test_slug.html new file mode 100644 index 0000000..0602a0a --- /dev/null +++ b/content/test_slug.html @@ -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}})] \ No newline at end of file diff --git a/controleurs/gamumail_nom_slug.html b/controleurs/gamumail_nom_slug.html new file mode 100644 index 0000000..f2cbcbb --- /dev/null +++ b/controleurs/gamumail_nom_slug.html @@ -0,0 +1,20 @@ +#CACHE{0} + + +
+
+ + +
+
+ + + diff --git a/css/gamumail.css b/css/gamumail.css index 96d810d..83b76dd 100644 --- a/css/gamumail.css +++ b/css/gamumail.css @@ -1,4 +1,4 @@ -/* surrounding tag container */ +/* les styles de tag-editor */ .tag-editor { list-style-type: none; padding: 0 5px 0 0; @@ -59,7 +59,6 @@ .tag-editor ::-ms-clear { display: none; } - /* tag style */ .tag-editor .tag-editor-tag { /*padding-left: 5px; color: #46799b; background: #e0eaf1; white-space: nowrap;*/ @@ -72,7 +71,6 @@ cursor: pointer; border-radius: 4px 0 0 4px; } - /* delete icon */ /*.tag-editor .tag-editor-delete { background: #e0eaf1; cursor: pointer; border-radius: 0 2px 2px 0; padding-left: 3px; padding-right: 4px; }*/ .tag-editor .tag-editor-delete { @@ -101,7 +99,6 @@ visibility: hidden; cursor: text; } - .tag-editor .tag-editor-tag.active { background: none !important; } @@ -150,6 +147,7 @@ display: none; } +/* les styles de gamumails */ .formulaire_gamumail { padding-top: 0; } @@ -162,17 +160,38 @@ .editer_pour label { width: 50px; } - .editer_cc { display: flex; } .editer_cc label { width: 50px; } - .editer_cci { display: flex; } .editer_cci label { 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; +} diff --git a/doc/configuration.png b/doc/configuration.png index e8df094..b0d7f4e 100644 Binary files a/doc/configuration.png and b/doc/configuration.png differ diff --git a/formulaires/gamumail.html b/formulaires/gamumail.html index eb73bd8..9685e5f 100644 --- a/formulaires/gamumail.html +++ b/formulaires/gamumail.html @@ -1,11 +1,10 @@ #CACHE{0} - + -
- -[

(#ENV*{message_erreur})

] -[

(#ENV*{message_ok})

] +
+ [

(#ENV*{message_erreur})

] + [

(#ENV*{message_ok})

]
#ACTION_FORMULAIRE{#ENV{action}} @@ -77,7 +76,7 @@ #SET{name,Tpdfs_ok} -

Fichiers PDF envoyés

+

<:gamumail:pdf_envoyes:>

#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} #SET{obli,"obligatoire"} @@ -85,59 +84,58 @@
- + [(#SET{url_pdf,[(#URL_PAGE{spipdf}|parametre_url{spipdf,#VALEUR})]})] + + [(#SET{url_pdf,[(#GET{url_pdf}|parametre_url{#CLE,#VALEUR})]})] + +
- #SET{id_gamumail,0} - #SET{name,Tid_doc} - #SET{id_gamumail,#ID_GAMUMAIL} - -

Autres Fichiers attachés

+ #SET{name,docs_spip} +

<:gamumail:documents_attaches:>

#SET{erreurs,#ENV**{erreurs}|table_valeur{#GET{name}}} - #SET{obli,"obligatoire"} -
- -
- - -
- +
+
+ [(#GET{erreurs})] + + +
#SET{fichier,#SLUG|concat{_fichiers}} [(#CHEMIN{gamumail/#GET{fichier}.html}|oui) + #SET{erreurs,#ENV**{erreurs}|table_valeur{Tid_doc}} + [(#GET{erreurs})] ] -
-
- diff --git a/formulaires/gamumail.php b/formulaires/gamumail.php index b8b2c14..a9b67d2 100644 --- a/formulaires/gamumail.php +++ b/formulaires/gamumail.php @@ -1,28 +1,38 @@ '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]] ou ['fichier' => 'pdf_facture', 'nom' => 'facture_123', 'contexte' => ['id_app_facture' => 3]] + * @param string $destinataires = adresses mails et id_auteurs séparées par , ou en array + * si un des destinataire est au format numérique, on considère que c'est un id_auteur et on va choper son mail dans spip_auteurs + * @param array $Tclient = un ou plusieurs mails de destinataires sortis d'une table objet spécifique + * de la forme []['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] ou ['objet' => 'app_client', 'id_objet' => 3, 'champ' => 'email'] + * @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 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 + * */ -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 = []; - if (intval($auteur)) { - $Tmails[] = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.intval($auteur)); - } elseif (is_string($auteur)) { - if (email_valide($auteur)) { - $Tmails[] = $auteur; + if (!is_array($destinataires)) { + $destinataires = explode(',', $destinataires); + } + foreach ($destinataires as $dest) { + if (is_numeric($dest)) { + if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) { + $Tmails[] = $mail; + } + } + elseif (email_valide($dest)) { + $Tmails[] = $dest; } } @@ -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( "slug" => $slug, 'sujet' => $gamuMail['sujet'], @@ -60,71 +70,148 @@ function formulaires_gamumail_charger_dist($slug, $auteur = 0, $Tclient = [], $T 'cci' => lire_config('gamumail/mail_cci'), 'TFichierpdfs' => $TFichierPdf, 'Tpdfs_ok' => [], - 'Tid_doc' => [], + 'docs_spip' => $gamuMail['id_docs'], + 'Tid_fichiers' => [], 'options' => $options ); + // surcharges charger 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)) { - $valeurs = $f($valeurs, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); + $valeurs = $f($valeurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect); } 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(); //champs obligatoire foreach (array ('pour', 'sujet', 'texte') as $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)) { - $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)) { - $erreurs = $f($erreurs, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); + $erreurs = $f($erreurs, $options, $slug, $destinataires, $Tclient, $Tpdf, $redirect); } 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('classes/facteur'); $retour = array(); - $pour = _request('pour'); - $cc = _request('cc'); - $cci = _request('cci'); - $sujet = _request('sujet'); - $html = propre(_request('texte')); - $Tid_doc = _request('Tid_doc'); - $Tpdfs_ok = _request('Tpdfs_ok'); - $texte = facteur_mail_html2text($html); + $pour = _request('pour'); + $cc = _request('cc'); + $cci = _request('cci'); + $sujet = _request('sujet'); + $html = propre(_request('texte')); + $docs_spip = _request('docs_spip'); + $Tpdfs_ok = _request('Tpdfs_ok'); + $Tid_doc = _request('Tid_doc'); + $texte = facteur_mail_html2text($html); $pour = explode(',', $pour); $cc = explode(',', $cc); $cci = explode(',', $cci); + $destinataires = []; + foreach ($pour as $dest) { + if (is_numeric($dest)) { + if ($mail = sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.$dest)) { + $destinataires[] = $mail; + } + } + elseif (email_valide($dest)) { + $destinataires[] = $dest; + } + } $pieces_jointes = []; 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)) { - $options = $f($options, $auteur, $Tclient, $Tpdf); + $options = $f($options, $destinataires, $Tclient, $Tpdf); } - // les documents joints - if (!empty($Tid_doc)) { - foreach ($Tid_doc as $id_document) { + // les documents par id_document + $docs_spip = ($docs_spip != '' ? explode(',', $docs_spip) : []); + if (!empty($docs_spip)) { + foreach ($docs_spip as $id_document) { $Tdocument = sql_fetsel('titre,fichier,extension','spip_documents','id_document='.intval($id_document)); $destination = _DIR_IMG.$Tdocument['fichier']; $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 $Tpdf_dell = []; 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 = ''; - - if(find_in_path('gamumail/html_header.html')){ - $html_header = recuperer_fond('gamumail/html_header', $options); - } elseif (find_in_path($slug . '_html_header.html')) { + 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/html_footer.html')){ - $html_footer = recuperer_fond('gamumail/html_footer', $options); - }elseif (find_in_path($slug . '_html_footer.html')) { + 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 plugin + $args = $options; + $args['slug'] = $slug; + $args['destinataires'] = $destinataires; + $html = pipeline('remplacements_slug', array( + 'args' => $args, + 'data' => $html + )); + $texte = facteur_mail_html2text($html); $corps = [ 'html' => $html, 'texte' => $texte, @@ -198,20 +314,25 @@ function formulaires_gamumail_traiter_dist($slug, $auteur = 0, $Tclient = [], $T 'pieces_jointes' => $pieces_jointes ]; + /* 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)) { - $corps = $f($corps, $options, $slug, $auteur, $Tclient, $Tpdf, $redirect); + $corps = $f($corps, $options, $slug, $destinataires); } $envoyer_mail = charger_fonction('envoyer_mail', 'inc/'); - $ok = $envoyer_mail($pour, $sujet, $corps); + $ok = $envoyer_mail($destinataires, $sujet, $corps); + if (!$ok) { - spip_log("Erreur d'envoi du mail : ","roc_mail"); - spip_log($corps,"roc"); + spip_log("Erreur d'envoi du mail : ","gamumail"); + spip_log($corps,"gamumail"); $retour['message_erreur'] = _T("gamumail:erreur_envoi_mail"); - } else { + } + else { $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; } return $retour; } - -function gamumail_supprimer_si_vide($v){ - if (!empty($v)) { - return $v; - } -} diff --git a/gamumail/html_footer.html b/gamumail/html_footer.html new file mode 100644 index 0000000..faf65ca --- /dev/null +++ b/gamumail/html_footer.html @@ -0,0 +1,3 @@ +
+ + diff --git a/gamumail/html_header.html b/gamumail/html_header.html new file mode 100644 index 0000000..4a2c04a --- /dev/null +++ b/gamumail/html_header.html @@ -0,0 +1,12 @@ + + + + + + #NOM_SITE_SPIP + + +
+ [] +
+
diff --git a/gamumail/remplacements_slugs.html b/gamumail/remplacements_slugs.html new file mode 100644 index 0000000..b680756 --- /dev/null +++ b/gamumail/remplacements_slugs.html @@ -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 + +] +
+

<:gamumail:remplacements_disponibles:>

+
    +
  • @@exemple_chaine@@ : remplacement de la chaine
  • +
+ <:gamumail:avertissement_remplacements:> +
diff --git a/gamumail_administrations.php b/gamumail_administrations.php index 511244d..d74c65d 100644 --- a/gamumail_administrations.php +++ b/gamumail_administrations.php @@ -26,32 +26,40 @@ if (!defined('_ECRIRE_INC_VERSION')) { function gamumail_upgrade($nom_meta_base_version, $version_cible) { $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.5'] = array(array('creer_compte_curl')); - - function creer_compte_curl(){ - $mdp = uniqid(uniqid(),1); - $set = [ - 'nom' => 'curl_login', - 'login' => hash('md5', 'curl_login'.time()), - 'pass' => hash('sha256', $mdp), - 'statut' => '1comite' - ]; - - include_spip('action/editer_auteur'); - $id_auteur = auteur_inserer(null, $set); - if ($id_auteur) { - include_spip('inc/config'); - ecrire_config('curl_login', $set['login']); - ecrire_config('curl_mdp', $mdp); - } - } + $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'))); 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); + $set = [ + 'nom' => 'curl_login', + 'login' => hash('md5', 'curl_login'.time()), + 'pass' => hash('sha256', $mdp), + 'statut' => '1comite' + ]; + + $id_auteur = sql_insertq('spip_auteurs', $set); + if ($id_auteur) { + include_spip('inc/config'); + ecrire_config('curl_login', $set['login']); + ecrire_config('curl_mdp', $mdp); + } +} /** * Fonction de désinstallation du plugin GamuMail. diff --git a/gamumail_autorisations.php b/gamumail_autorisations.php index 5e97349..a6987d1 100644 --- a/gamumail_autorisations.php +++ b/gamumail_autorisations.php @@ -24,11 +24,8 @@ function gamumail_autoriser() { // ----------------- // Objet gamumails - - - 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) { @@ -36,7 +33,7 @@ function autoriser_gamumail_voir_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) { @@ -46,3 +43,11 @@ function autoriser_gamumail_supprimer_dist($faire, $type, $id, $qui, $opt) { function autoriser_gamumail_configurer_dist($faire, $type, $id, $qui, $opt) { return autoriser('webmestre'); } +/** + * Autorisation de modifier le nom d'un slug + * uniquement les webmestres avec un mail en @gamuza.fr + **/ +function autoriser_gamumail_modifier_nom_slug_dist($faire, $type, $id, $qui, $opt) { + return $qui['webmestre'] === "oui" + and strpos($qui['email'], 'gamuza.fr') !== false; +} diff --git a/gamumail_fonctions.php b/gamumail_fonctions.php index 76b6837..d0a795a 100644 --- a/gamumail_fonctions.php +++ b/gamumail_fonctions.php @@ -16,3 +16,86 @@ if (!defined('_ECRIRE_INC_VERSION')) { function gamumail_TabClient($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; +} + diff --git a/gamumail_pipelines.php b/gamumail_pipelines.php index 353b26a..d83f26f 100644 --- a/gamumail_pipelines.php +++ b/gamumail_pipelines.php @@ -13,7 +13,21 @@ if (!defined('_ECRIRE_INC_VERSION')) { 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 * @return array Données du pipeline */ +/* function gamumail_optimiser_base_disparus($flux) { sql_delete('spip_gamumails', "statut='poubelle' AND maj < " . $flux['args']['date']); return $flux; } + */ diff --git a/inc/charger_pdf.php b/inc/charger_pdf.php index 8fd1d61..5300723 100644 --- a/inc/charger_pdf.php +++ b/inc/charger_pdf.php @@ -3,22 +3,30 @@ if (!defined('_ECRIRE_INC_VERSION')){ return; } - function inc_charger_pdf_dist($fichier_pdf, $contexte = []){ $login = lire_config('curl_login'); $password = lire_config('curl_mdp'); $url = $GLOBALS['meta']['adresse_site'].'/spip.php?page=spipdf&spipdf='.$fichier_pdf; if (is_array($contexte) and count($contexte)) { foreach ($contexte as $champ => $val) { - if (intval($val)) { +/* if (intval($val) === $val) { + // if (intval($val)) { $val = intval($val); } else { $val = "$val"; } +*/ $url .= "&$champ=$val"; } } + $CurlConnect = curl_init(); + + // pour une connexion https locale avec certificat auto-signé + if (defined('_DEBUG_AUTORISER')) { + curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYHOST, false); + curl_setopt($CurlConnect, CURLOPT_SSL_VERIFYPEER, false); + } curl_setopt($CurlConnect, CURLOPT_URL, $url); curl_setopt($CurlConnect, CURLOPT_RETURNTRANSFER, 1 ); //curl_setopt($CurlConnect, CURLOPT_POSTFIELDS, $request); diff --git a/inc/envoyer_gamumail.php b/inc/envoyer_gamumail.php new file mode 100644 index 0000000..f1c3c0d --- /dev/null +++ b/inc/envoyer_gamumail.php @@ -0,0 +1,235 @@ + 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 '
slug : '.$slug; + echo '
$options :'; + var_dump($options); + echo '
$pour : '; + var_dump($pour); + echo '
$sujet : '.$sujet; + echo '
$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; +} diff --git a/inclure/envoyer_gamumail.html b/inclure/envoyer_gamumail.html new file mode 100644 index 0000000..ac00ba9 --- /dev/null +++ b/inclure/envoyer_gamumail.html @@ -0,0 +1,53 @@ +[(#REM) + page d'envoi d'un gamumail + +] + +
+ +
+

<:gamumail:choix_slug:>

+ +
+
+
+ +
+ +
+ \ No newline at end of file diff --git a/inclure/gamumail_config.html b/inclure/gamumail_config.html index 78b180a..0824289 100644 --- a/inclure/gamumail_config.html +++ b/inclure/gamumail_config.html @@ -1,16 +1,18 @@ +[(#AUTORISER{modifier,gamumail}|sinon_interdire_acces)] +
-

Configuration des mails

-
-

Emails en copie "cc" des différents messages - [(#CONFIG{gamumail/mail_cc}|sinon{cliquer})] -

-

Si plusieurs emails, les séparer par une virgule

+

<:gamumail:email_en_cc:>

+
[(#CONFIG{gamumail/mail_cc}|sinon{<:gamumail:dbe_clic_editer:>})]
+

<:gamumail:plusieurs_mails_separer_virgule:> <:gamumail:dbe_clic_editer:>.

-

Emails en copie cachée "cci" des différents messages - [(#CONFIG{gamumail/mail_cci}|sinon{cliquer})] -

-

Si plusieurs emails, les séparer par une virgule

+

<:gamumail:email_en_cci:>

+
[(#CONFIG{gamumail/mail_cci}|sinon{<:gamumail:dbe_clic_editer:>})]
+

<:gamumail:plusieurs_mails_separer_virgule:> <:gamumail:dbe_clic_editer:>.

+ <:gamumail:dbe_clic_editer_champs:>
- -
-
-

- - [(#TITRE)] - -

+ +
+
+ [(#AUTORISER{supprimer,gamumail}|oui) + + ] + +

+ + [(#TITRE)] + +

-
- [(#AUTORISER{webmestre}|oui) -
- Slug : - [(#SLUG|sinon{cliquez})] -
- ] -
- Objet : - [(#SUJET|sinon{cliquez})] -
- Message : -
[(#TEXTE|sinon{cliquez})]
- [(#REM) - Pour l'instant, inutile -
- -
- ] - [(#ENV{ajouter_doc}|oui) -
- #FORMULAIRE_BIGFORM{gamumail, #ID_GAMUMAIL} -
- ] +
+
+ <:gamumail:slug:>: + [(#AUTORISER{modifier_nom_slug,gamumail}|?{ + [(#SLUG|sinon{<:gamumail:dbe_clic_editer:>})] + , + [(#SLUG)] + })]
+
+ <:gamumail:objet:>: + [(#SUJET|sinon{<:gamumail:dbe_clic_editer:>})] +
+
+ <:gamumail:message:>: +
+ [(#TEXTE|sinon{<:gamumail:dbe_clic_editer:>})] +
+
+
+ <:gamumail:documents_attaches:> : <:gamumail:liste_id_separes:> , +
+ [(#ID_DOCS|sinon{<:gamumail:dbe_clic_editer:>})] +
+
+
+ <:gamumail:visibilite_public:>: <:gamumail:explication_mail_auto_uniquement:> + [(#PUBLIC|=={oui}|oui) + <:gamumail:modele_visible:> => + + <:gamumail:modele_masquer:> + + ][(#PUBLIC|=={oui}|non) + <:gamumail:modele_non_visible:> => + + <:gamumail:modele_afficher:> + + ] +
+ + [(#REM) + Pour l'instant, inutile +
+ +
+ ] + [(#ENV{ajouter_doc}|oui) +
+ #FORMULAIRE_BIGFORM{gamumail, #ID_GAMUMAIL} +
+ ]
- - - - +
+ + [(#AUTORISER{creer,gamumail}|oui) + Nouveau modèle + ] +
+ +
diff --git a/inclure/gamumail_pdfs.html b/inclure/gamumail_pdfs.html index 540acb1..a4afb83 100644 --- a/inclure/gamumail_pdfs.html +++ b/inclure/gamumail_pdfs.html @@ -3,7 +3,7 @@ ]
- [(#AUTORISER{webmestre}|oui) + [(#AUTORISER{modifier,gamumail}|oui) + pdf diff --git a/inclure/vue_slug.html b/inclure/vue_slug.html new file mode 100644 index 0000000..c6aa3c6 --- /dev/null +++ b/inclure/vue_slug.html @@ -0,0 +1,11 @@ +

<:gamumail:contenu_mail:>

+
+ [(#FORMULAIRE_GAMUMAIL{ + #ENV{slug}, + #ENV{dest}, + #ENV{client}, + #ENV{Tpdf}, + #ENV{redirect}, + #ARRAY{} + })] +
diff --git a/lang/gamumail_fr.php b/lang/gamumail_fr.php index f77c4b5..96aa2fa 100644 --- a/lang/gamumail_fr.php +++ b/lang/gamumail_fr.php @@ -10,16 +10,34 @@ $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', + + // 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 '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 + 'pdf_envoyes' => 'Fichiers PDF envoyés', // I 'icone_creer_gamumail' => 'Créer un gamumail', @@ -28,16 +46,40 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( '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', + + // 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 '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', + 'switch_modele_public' => 'Modifier la visibilité publique du modèle', // T 'texte_ajouter_gamumail' => 'Ajouter un gamumail', @@ -50,4 +92,7 @@ $GLOBALS[$GLOBALS['idx_lang']] = array( 'titre_langue_gamumail' => 'Langue de ce gamumail', 'titre_logo_gamumail' => 'Logo de ce gamumail', 'titre_objets_lies_gamumail' => 'Liés à ce gamumail', + + // V + 'visibilite_public' => 'Disponible dans la liste des modèles', ); diff --git a/paquet.xml b/paquet.xml index 490c6f0..5d8f59e 100644 --- a/paquet.xml +++ b/paquet.xml @@ -1,12 +1,12 @@ GamuMail @@ -19,6 +19,7 @@ + diff --git a/saisies/selecteur_slug.html b/saisies/selecteur_slug.html new file mode 100644 index 0000000..0312bfb --- /dev/null +++ b/saisies/selecteur_slug.html @@ -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... + })] + +] + + + <:gamumail:aucun_slug_disponible:> + \ No newline at end of file diff --git a/vues/gamumail_nom_slug.html b/vues/gamumail_nom_slug.html new file mode 100644 index 0000000..670914e --- /dev/null +++ b/vues/gamumail_nom_slug.html @@ -0,0 +1,3 @@ + + #SLUG + \ No newline at end of file