Compare commits

..

No commits in common. "master" and "multi_pdf" have entirely different histories.

26 changed files with 426 additions and 1287 deletions

277
README.md
View file

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

View file

@ -1,8 +1,6 @@
<?php <?php
if (!defined('_ECRIRE_INC_VERSION')) return; if (!defined('_ECRIRE_INC_VERSION')) return;
defined('_GAMUMAIL_PREFIX_SLUG') || define('_GAMUMAIL_PREFIX_SLUG', "slug");
/** /**
* créer un slug Gamumail * créer un slug Gamumail
* *
@ -23,17 +21,16 @@ function action_creer_slug_dist($slug = null, $opt = [], $ecraser = false){
// Arrive d'une action SPIP // Arrive d'une action SPIP
if ($slug === null) { if ($slug === null) {
$set = [ $set = [
'slug' => '', 'slug' => '',
'titre' => 'Le titre du modèle', 'titre' => 'Le titre du modèle',
'sujet' => 'Le sujet du mail', 'sujet' => 'Le sujet du mail',
'texte' => 'Le texte du mail', 'texte' => 'Le texte du mail',
'statut' => 'publie', 'statut' => 'publie',
'editable' => '', 'editable' => '',
]; ];
if ($id_slug = objet_inserer('gamumail', null, $set)) { if ($id_slug = objet_inserer('gamumail', null, $set)) {
$slug = getSlugGamumail($id_slug); $set = ['slug' => 'slug_'.$id_slug];
$set = ['slug' => $slug];
sql_updateq('spip_gamumails', $set, 'id_gamumail = '.$id_slug); sql_updateq('spip_gamumails', $set, 'id_gamumail = '.$id_slug);
} }
} else { } else {
@ -60,16 +57,3 @@ function action_creer_slug_dist($slug = null, $opt = [], $ecraser = false){
include_spip('inc/invalideur'); include_spip('inc/invalideur');
suivre_invalideur("id='id_gamumail/1'"); suivre_invalideur("id='id_gamumail/1'");
} }
function getSlugGamumail(int $id_gamumail, int|null $suffix = 0):string {
$slug = _GAMUMAIL_PREFIX_SLUG .'_'.$id_gamumail;
if ($suffix) {
$slug .= '_'.$suffix;
}
if (sql_countsel('spip_gamumails', ['slug='.sql_quote($slug)])) {
$suffix++;
return getSlugGamumail($id_gamumail, $suffix);
}
return $slug;
}

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
[(#REM) [(#REM)
la liste des remplacements joués dans tous les slugs GamuMail la liste des remplacements joués dans tous les slugs GamuMail
+ tous ceux des plugins qui les documentent via $GLOBALS'remplacements_gamumail' + tous ceux des plugins qui les documentent via $GLOBALS'remplacements_gamumail'
inclure pour la page de configuration des gamumails inclure pour la page de configuration des gamumails
@ -9,11 +9,8 @@
<h3 class="spip"><:gamumail:remplacements_disponibles:></h3> <h3 class="spip"><:gamumail:remplacements_disponibles:></h3>
<ul class=""> <ul class="">
<BOUCLE_remplace(DATA){source tableau, #VAL|afficher_remplacements}> <BOUCLE_remplace(DATA){source tableau, #VAL|afficher_remplacements}>
<li><span class="toClip pointer" data-clipboard-text="#CLE"><strong>[(#CLE)]</strong> </span>: [(#VALEUR)]</li> <li><strong>[(#CLE)]</strong> : [(#VALEUR)]</li>
</BOUCLE_remplace> </BOUCLE_remplace>
</ul> </ul>
<em><:gamumail:avertissement_remplacements:></em> <em><:gamumail:avertissement_remplacements:></em>
</div> </div>
<script src="[(#CHEMIN{javascript/spip_barre.js}|timestamp)]" type="text/javascript"></script>
<script src="[(#CHEMIN{js/toClip.js}|timestamp)]" type="text/javascript"></script>

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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