branchons le contact.

svn/root/tags/v0.16.6
cedric@yterium.com 12 years ago
commit 2dec1f6506

61
.gitattributes vendored

@ -0,0 +1,61 @@
* text=auto !eol
action/effacer_configuration.php -text
action/supprimer_message.php -text
base/contact_installation.php -text
base/contact_tables.php -text
/contact_options.php -text
/contact_pipelines.php -text
contenu/page-contact.html -text
contenu/page-contact.xml -text
exec/contact_messages.php -text
exec/contact_select_message.php -text
exec/contact_un_message.php -text
fonds/cfg_contact.html -text
formulaires/configurer_contact.html -text
formulaires/contact.html -text
formulaires/contact.php -text
formulaires/contact_champ_civilite.html -text
formulaires/contact_champ_infolettre.html -text
formulaires/contact_champ_mail.html -text
formulaires/contact_champ_texte.html -text
icones_barre/contact.png -text
images/contact-128.png -text
images/contact-20.png -text
images/contact-24.png -text
images/img1.png -text
images/img10.png -text
images/img11.png -text
images/img12.png -text
images/img13.png -text
images/img14.png -text
images/img15.png -text
images/img2.png -text
images/img3.png -text
images/img4.png -text
images/img5.png -text
images/img6.png -text
images/img7.png -text
images/img8.png -text
images/img9.png -text
lang/contact.xml -text
lang/contact_ar.php -text
lang/contact_ca.php -text
lang/contact_de.php -text
lang/contact_en.php -text
lang/contact_es.php -text
lang/contact_fr.php -text
lang/contact_fr_tu.php -text
lang/contact_pt_br.php -text
lang/contact_sk.php -text
lang/public_fr.php -text
menus/contact.html -text
menus/contact.xml -text
modeles/formulaire_contact.yaml -text
noisettes/formulaire_contact.html -text
noisettes/formulaire_contact.yaml -text
/plugin.xml -text
prive/contenu/message_contact.html -text
prive/exec/configurer_contact.html -text
prive/infos/message_contact.html -text
prive/style_prive_plugin_contact.html -text
prive/themes/spip/images/contact-20.png -text

@ -0,0 +1,13 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function action_effacer_configuration_dist(){
$securiser_action = charger_fonction('securiser_action', 'inc');
$arg = $securiser_action();
if (!autoriser('configurer'))
return false;
if($arg == 'contact'){effacer_meta($arg);}else{return false;}
}
?>

@ -0,0 +1,27 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/filtres');
/**
* Suppression d'un message du formulaire de contact
*/
function action_supprimer_message() {
$securiser_action = charger_fonction('securiser_action', 'inc');
$id_message = $securiser_action();
/**
* Vérifions si nous avons un document
*/
if($docs = sql_select('id_document','spip_documents_liens','id_objet='.intval($id_message).' AND objet="message"')){
include_spip('action/documenter');
while($id_doc = sql_fetch($docs)){
supprimer_lien_document($id_doc['id_document'], "message", $id_message);
}
}
sql_delete("spip_messages", "id_message=".sql_quote($id_message));
sql_delete("spip_auteurs_messages", "id_message=".sql_quote($id_message));
}
?>

@ -0,0 +1,72 @@
<?php
include_spip('inc/meta');
// Installation et mise à jour
function contact_upgrade($nom_meta_version_base, $version_cible){
$version_actuelle = '0.0';
if (
(!isset($GLOBALS['meta'][$nom_meta_version_base]))
|| (($version_actuelle = $GLOBALS['meta'][$nom_meta_version_base]) != $version_cible)
){
if (version_compare($version_actuelle,'0.0','=')){
// Création des tables
include_spip('base/create');
include_spip('base/abstract_sql');
creer_base();
echo "Création des tables de messageries si inexistantes.<br/>";
ecrire_meta($nom_meta_version_base, $version_actuelle=$version_cible, 'non');
}
/*if (version_compare($version_actuelle,'0.5','<')){
include_spip('base/create');
include_spip('base/abstract_sql');
// Modification de contact
sql_alter('');
// On change la version
echo "Mise à jour du plugin contact en version 0.5<br/>";
ecrire_meta($nom_meta_version_base, $version_actuelle=$version_cible, 'non');
}*/
}
}
// Désinstallation
function contact_vider_tables($nom_meta_version_base){
include_spip('base/abstract_sql');
// On recupere tous les messages de contact
$messages = sql_allfetsel(
'id_message',
'spip_messages',
'type = '.sql_quote('contac')
);
$messages = array_map('reset', $messages);
$in = sql_in(
'id_messages',
$messages
);
// On supprime les messages
sql_delete(
'spip_messages',
'type = '.sql_quote('contact')
);
// On supprime les liens
sql_delete(
'spip_auteurs_messages',
$in
);
// On efface la version entregistrée
effacer_meta($nom_meta_version_base);
}
?>

@ -0,0 +1,59 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
function contact_declarer_tables_principales($tables_principales) {
// On vérifie si la table n'a pas déjà été déclarée.
if(!$tables_principales['spip_messages']) {
// déclaration de la table spip_messages
$spip_messages = array(
"id_message" => "bigint(21) NOT NULL",
"titre" => "text DEFAULT '' NOT NULL",
"texte" => "longtext DEFAULT '' NOT NULL",
"type" => "varchar(6) DEFAULT '' NOT NULL",
"date_heure" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
"date_fin" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL",
"rv" => "varchar(3) DEFAULT '' NOT NULL",
"statut" => "varchar(6) DEFAULT '0' NOT NULL",
"id_auteur" => "bigint(21) NOT NULL",
"maj" => "TIMESTAMP");
$spip_messages_key = array(
"PRIMARY KEY" => "id_message",
"KEY id_auteur" => "id_auteur");
$tables_principales['spip_messages'] = array(
'field' => &$spip_messages,
'key' => &$spip_messages_key);
}
return $tables_principales;
}
function contact_declarer_tables_interfaces($interface){
$interface['table_des_tables']['messages'] = 'messages';
$interface['tables_jointures']['spip_messages'][] = 'messages';
return $interface;
}
function contact_declarer_tables_auxiliaires($tables_auxiliaires){
// On vérifie si la table n'a pas déjà été déclarée.
if(!$tables_auxiliaires['spip_auteurs_messages']) {
// Déclaration de la table spip_auteurs_messages
$spip_auteurs_messages = array(
"id_auteur" => "bigint(21) DEFAULT '0' NOT NULL",
"id_message" => "bigint(21) DEFAULT '0' NOT NULL",
"vu" => "CHAR (3)");
$spip_auteurs_messages_key = array(
"PRIMARY KEY" => "id_auteur, id_message",
"KEY id_message" => "id_message");
$tables_auxiliaires['spip_auteurs_messages'] = array(
'field' => &$spip_auteurs_messages,
'key' => &$spip_auteurs_messages_key);
}
return $tables_auxiliaires;
}
?>

@ -0,0 +1,35 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
// Minima requis pour le champs texte; a definir dans un mes_options
//define('_TEXTE_MIN','3');
// Déclaration du pipeline
if (!isset($GLOBALS['spip_pipeline']['contact_infos_supplementaires']))
$GLOBALS['spip_pipeline']['contact_infos_supplementaires'] = '';
function contact_infos_supplementaires(){
$champs = array(
'civilite' => _T('contact:champ_civilite'),
'prenom' => _T('contact:champ_prenom'),
'nom' => _T('contact:champ_nom'),
'organisation' => _T('contact:champ_organisation'),
'adresse' => _T('contact:champ_adresse'),
'code_postal' => _T('contact:champ_code_postal'),
'ville' => _T('contact:champ_ville'),
'etat' => _T('contact:champ_etat'),
'pays' => _T('contact:champ_pays'),
'telephone' => _T('contact:champ_telephone'),
'portable' => _T('contact:champ_portable'),
'mail' => _T('contact:champ_mail'),
'sujet' => _T('contact:champ_sujet'),
'texte' => _T('contact:champ_texte'),
'infolettre' => _T('contact:champ_infolettre')
);
$champs = pipeline('contact_infos_supplementaires', $champs);
return $champs;
}
?>

@ -0,0 +1,19 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
/**
* Pipeline jqueryui_forcer pour demander au plugin l'insertion des scripts pour .sortable()
*
* @param array $plugins
* @return array
*/
function contact_jqueryui_forcer($plugins){
$plugins[] = "jquery.ui.core";
$plugins[] = "jquery.ui.widget";
$plugins[] = "jquery.ui.mouse";
$plugins[] = "jquery.ui.sortable";
return $plugins;
}
?>

@ -0,0 +1,12 @@
[(#PLUGIN{zvide}|non)
[(#REM) Fil d'Ariane ]
<p id="hierarchie"><a href="#URL_SITE_SPIP/"><:accueil_site:></a><span class="sep"> &gt; </span><strong class="on"><:contact:titre:></strong></p>
<div class="contenu-principal">
<div class="cartouche">
</div>
<div class="formulaire_conctact ajax">
#FORMULAIRE_CONTACT
</div>
</div>
]

@ -0,0 +1,5 @@
<page>
<nom><:contact:titre_court:></nom>
<description><:contact:description_page-contact:></description>
<icon>images/contact-24.png</icon>
</page>

@ -0,0 +1,43 @@
<?php
include_spip('inc/presentation');
include_spip('exec/contact_select_message');
function exec_contact_messages() {
global $connect_id_auteur, $connect_statut, $spip_lang_rtl;
$commencer_page = charger_fonction('commencer_page', 'inc');
echo $commencer_page("Messages de contact", "forum", "contact_messages");
echo debut_gauche("contact_messages",true);
echo debut_boite_info(true);
echo _T('contact:msg_accueil');
echo fin_boite_info(true);
echo debut_droite("contact_messages", true);
$messages_vus = array();
$nouveaux_messages = afficher_ses_messages(_T('contact:msg_nouveaux'), ", spip_auteurs_messages AS lien", "lien.id_auteur=$connect_id_auteur AND vu='non' AND statut='publie' AND type='contac' AND lien.id_message=messages.id_message", $messages_vus, true, false);
if ($nouveaux_messages)
echo $nouveaux_messages;
else {
echo debut_boite_info(true);
echo _T('contact:msg_pas_nouveaux');
echo fin_boite_info(true);
}
echo afficher_ses_messages('<b>' . _T('contact:msg_lus') . '</b>', ", spip_auteurs_messages AS lien", "lien.id_auteur=$connect_id_auteur AND vu!='non' AND statut='publie' AND type='contac' AND lien.id_message=messages.id_message", $messages_vus, true, false);
echo fin_gauche(), fin_page();
}
?>

@ -0,0 +1,68 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
// $messages_vus en reference pour interdire l'affichage de message en double
function afficher_ses_messages($titre, $from, $where, &$messages_vus, $afficher_auteurs = false, $important = false) {
$requete = array('SELECT' => 'messages.id_message, messages.date_heure, messages.date_fin, messages.titre, messages.type, messages.rv', 'FROM' => "spip_messages AS messages$from", 'WHERE' => $where .(!$messages_vus ? '' : ' AND messages.id_message NOT IN ('.join(',', $messages_vus).')'), 'ORDER BY'=> 'date_heure DESC');
// Même si on ne s'en sert pas (car presenter_liste le demande)
$styles = array(array('arial2'), array('arial1', 20), array('arial1', 120));
$presenter_liste = charger_fonction('presenter_liste', 'inc');
$tmp_var = 't_' . substr(md5(join('', $requete)), 0, 4);
// cette variable est passe par reference et recevra les valeurs du champ indique
$les_messages = 'id_message';
$res = $presenter_liste($requete, 'presenter_message_boucles', $les_messages, $afficher_auteurs, $important, $styles, $tmp_var, $titre, find_in_path('contact-24.png', 'images/', false));
$messages_vus = array_merge($messages_vus, $les_messages);
if (!$res) return '';
else
return
(debut_cadre_couleur('',true)
. $res
. fin_cadre_couleur(true));
}
function presenter_message_boucles($row, $afficher_auteurs)
{
global $connect_id_auteur, $spip_lang_left, $spip_lang_rtl;
$vals = array();
$id_message = $row['id_message'];
$date = $row["date_heure"];
$titre = sinon($row['titre'], _T('ecrire:info_sans_titre'));
//Titre
$s = "<a href='" . generer_url_ecrire("contact_un_message","id_message=$id_message") . "' style='display: block;'>";
$s .= typo($titre)."</a>";
$vals[] = $s;
// Auteurs
if ($afficher_auteurs) {
$auteur = sql_fetsel(
"auteur.id_auteur, auteur.nom, auteur.email",
"spip_auteurs AS auteur, spip_messages AS message",
"message.id_message=$id_message AND auteur.id_auteur=message.id_auteur"
);
$id_auteur = $auteur['id_auteur'];
$s = "<a href='" . generer_url_ecrire("auteur_infos","id_auteur=$id_auteur") . "'>".sinon(typo($auteur['nom']), $auteur['email'])."</a>";
$vals[] = $s;
}
// Date
$s = affdate($date);
$s = "<span style='color: #999999'>$s</span>";
$vals[] = $s;
return $vals;
}
?>

@ -0,0 +1,151 @@
<?php
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/presentation');
function exec_contact_un_message_dist()
{
exec_contact_un_message_args(intval(_request('id_message')));
}
// Marque le message comme vu et demande à afficher le message dont l'id_message est passé en paramètre
function exec_contact_un_message_args($id_message)
{
pipeline('exec_init',array('args'=>array('exec'=>'contact_un_message','id_message'=>$id_message),'data'=>''));
$row = sql_fetsel("*", "spip_messages", "id_message=$id_message AND type='contac'");
if (!$row
OR !autoriser('voir', 'message', $id_message)) {
include_spip('inc/minipres');
echo minipres(_T('contact:aucun_message'));
} else {
marquer_message_vu($id_message, $GLOBALS['visiteur_session']['id_auteur']);
$row['titre'] = sinon($row["titre"]);
$res = debut_gauche('accueil',true)
. message_affiche($id_message, $row)
. "<br /><br /><div class='centered'>"
. "</div>"
. fin_gauche();
$commencer_page = charger_fonction('commencer_page', 'inc');
echo $commencer_page("&laquo; ". $row['titre'] ." &raquo;", "accueil", "messagerie");
echo debut_grand_cadre(true),
fin_grand_cadre(true),
$res,
fin_page();
}
}
// Affichage de la page + message
function message_affiche($id_message, $row)
{
$id_message = $row['id_message'];
$date_heure = $row["date_heure"];
$titre = typo($row["titre"]);
$id_auteur = $row['id_auteur'];
$iconifier = charger_fonction('iconifier', 'inc');
$icone = $iconifier('id_message', $id_message,'messages', false, $flag_editable);
$boite = pipeline ('boite_infos', array('data' => '',
'args' => array(
'type'=>'message_contact',
'id' => $id_message,
'row' => $row
)
));
$actions = icone_inline(_T('contact:msg_supprimer_message'), redirige_action_auteur("supprimer_message", "$id_message", 'contact_messages'), find_in_path("images/contact-24.png"), "supprimer.gif",$GLOBALS['spip_lang_right']);
$haut =
"<div class='bandeau_actions'>$actions</div>".
(_INTERFACE_ONGLETS?"":"<span $dir_lang class='arial1 spip_medium'><b>" . _T('contact:msg_contact') . "</b></span>\n")
. gros_titre($titre, '' , false)
. (_INTERFACE_ONGLETS?"":"<span $dir_lang class='arial1 spip_medium'><b>" . nom_jour($date_heure) ." ".affdate_heure($date_heure). "</b></span><br /><br />\n");
$navigation =
debut_boite_info(true). $boite . fin_boite_info(true)
. $icone
. pipeline('affiche_gauche',array('args'=>array('exec'=>'contact_un_message','id_message'=>$id_message),'data'=>''));
$extra = creer_colonne_droite('', true)
. pipeline('affiche_droite',array('args'=>array('exec'=>'contact_un_message','id_message'=>$id_message),'data'=>''))
. debut_droite('',true);
$onglet_contenu =
http_affiche_un_message($id_message);
$onglet_documents = afficher_pieces_jointes('message', intval($id_message));
return
$navigation
. $extra
. pipeline('afficher_fiche_objet',array('args'=>array('type'=>'message','id'=>$id_message),'data'=>
"<div class='fiche_objet'>"
. $haut
. afficher_onglets_pages(
array(
'voir' => _T('onglet_contenu'),
'docs' => _T('onglet_documents')),
array(
'voir'=>$onglet_contenu,
'docs'=>$onglet_documents))
. "</div>"
));
}
/**
* Marque le message comme vu
*
* @param int $id_message
* @param int $id_auteur
*/
function marquer_message_vu($id_message, $id_auteur) {
sql_updateq("spip_auteurs_messages", array("vu" => 'oui'), "id_message=$id_message AND id_auteur=$id_auteur");
/**
* Si le message est affiché dans l'espace public, on invalide le cache
*/
include_spip('inc/invalideur');
suivre_invalideur("message/".$id_message);
}
// Affiche le message
function http_affiche_un_message($id_message)
{
$type = 'message_contact';
$contexte = array(
'id'=>$id_message,
);
$fond = recuperer_fond("prive/contenu/$type",$contexte);
//permettre aux plugins de faire des modifs ou des ajouts
$fond = pipeline('afficher_contenu_objet',
array(
'args'=>array(
'type'=>$type,
'id_objet'=>$id_message,
'contexte'=>$contexte),
'data'=> ($fond)));
$res .= "<div id='wysiwyg'>$fond</div>";
return $res;
}
// Fonction d'affichage des pièces jointes
function afficher_pieces_jointes($type, $id) {
$documenter = charger_fonction('documenter', 'inc');
return "<div id='portfolio'>" . $documenter($id, $type, 'portfolio') . "</div><br />"
. "<div id='documents'>" . $documenter($id, $type, 'documents') . "</div>";
}
?>

@ -0,0 +1,8 @@
<!-- titre=<:contact:titre:> -->
<!-- icone=images/contact-24.png -->
<!-- logo=images/contact-128.png -->
#CACHE{0}
<div class="ajax">
#FORMULAIRE_CONFIGURER_CONTACT
</div>

@ -0,0 +1,300 @@
<!-- nom=contact -->
<div class="formulaire_spip formulaire_editer formulaire_#FORM">
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<form method="post" action="#ENV{action}">
<div>
#ACTION_FORMULAIRE{#ENV{action}}
<fieldset>
<legend><:contact:configuration_destinataires:></legend>
<ul class="decaler">
<li class="editer_choix_destinataires haut pleine_largeur">
<label><:contact:configuration_destinataires_explication:></label>
<B_auteurs>
<select name="choix_destinataires[]" id="choix_destinataires" multiple="multiple" size="[(#GRAND_TOTAL|<{26}|?{#GRAND_TOTAL,25})]">
<BOUCLE_auteurs(AUTEURS){tous}{email!=''}{par nom}>
<option value="#ID_AUTEUR" [(#ID_AUTEUR|in_array{#ENV{choix_destinataires,#ARRAY}}|oui)selected="selected"]>
[(#NOM)] (##ID_AUTEUR - [(#ARRAY{0minirezo,info_administrateurs,1comite,info_redacteurs,6forum,info_visiteurs,5poubelle,texte_statut_poubelle,contact,contact:titre}|table_valeur{#STATUT}|_T)[ (#NOM|non)#EMAIL]])
</option>
</BOUCLE_auteurs>
</select>
</B_auteurs>
</li>
<li class="editer_type_choix haut pleine_largeur">
<label><:contact:configuration_regle_liste_explication:></label>
<div class="choix">
<input type="radio" name="type_choix" id="tous" class="radio" value="tous"[ checked="checked"(#ENV{type_choix}|=={tous}|ou{#ENV{type_choix}|non}|oui)] />
<label for="tous"><:contact:configuration_destinataires_tous:></label>
</div>
<div class="choix">
<input type="radio" name="type_choix" id="tous_ou" class="radio" value="tous_ou"[ checked="checked"(#ENV{type_choix}|=={tous_ou}|oui)] />
<label for="tous_ou"><:contact:configuration_destinataires_tous_ou:></label>
</div>
<div class="choix">
<input type="radio" name="type_choix" id="tous_et" class="radio" value="tous_et"[ checked="checked"(#ENV{type_choix}|=={tous_et}|oui)] />
<label for="tous_et"><:contact:configuration_destinataires_tous_et:></label>
</div>
</li>
<li class="editer_type_choix haut pleine_largeur">
<div class="choix">
<input type="radio" name="type_choix" id="un" class="radio" value="un"[ checked="checked"(#ENV{type_choix}|=={un}|oui)] />
<label for="un"><:contact:configuration_destinataires_un:></label>
</div>
<div class="choix">
<input type="radio" name="type_choix" id="un_ou" class="radio" value="un_ou"[ checked="checked"(#ENV{type_choix}|=={un_ou}|oui)] />
<label for="un_ou"><:contact:configuration_destinataires_un_ou:></label>
</div>
<div class="choix">
<input type="radio" name="type_choix" id="un_et" class="radio" value="un_et"[ checked="checked"(#ENV{type_choix}|=={un_et}|oui)] />
<label for="un_et"><:contact:configuration_destinataires_un_et:></label>
</div>
</li>
<li class="editer_type_choix haut pleine_largeur">
<div class="choix">
<input type="radio" name="type_choix" id="plusieurs" class="radio" value="plusieurs"[ checked="checked"(#ENV{type_choix}|=={plusieurs}|oui)] />
<label for="plusieurs"><:contact:configuration_destinataires_plusieurs:></label>
</div>
<div class="choix">
<input type="radio" name="type_choix" id="plusieurs_ou" class="radio" value="plusieurs_ou"[ checked="checked"(#ENV{type_choix}|=={plusieurs_ou}|oui)] />
<label for="plusieurs_ou"><:contact:configuration_destinataires_plusieurs_ou:></label>
</div>
<div class="choix">
<input type="radio" name="type_choix" id="plusieurs_et" class="radio" value="plusieurs_et"[ checked="checked"(#ENV{type_choix}|=={plusieurs_et}|oui)] />
<label for="plusieurs_et"><:contact:configuration_destinataires_plusieurs_et:></label>
</div>
<div class="choix">
<input type="checkbox" name="c" id="c" class="checkbox" value="c"[ (#ENV{c}|=={c}|oui)checked="checked"] />
<label for="c"><:contact:preselection:></label>
</div>
</li>
</ul>
</fieldset>
[(#REM)
On récupère les champs possibles
Mais on divise en deux :
- d'abord les champs choisis
- puis les champs qui restent
]
#SET{champs_possibles, #VAL{rien}|contact_infos_supplementaires}
#SET{champs_choisis, #CONFIG{contact/champs,#ARRAY}|array_flip}
#SET{champs,#GET{champs_choisis}|array_merge{#GET{champs_possibles}}}
<fieldset>
<legend><:contact:infos_collecte:></legend>
<ol id="editer_champs" class="numeroter">
<BOUCLE_champs(POUR){tableau #GET{champs}}>
<li class="editer_champ pleine_largeur agrondir" title="<:contact:deplacement_possible:>" style="overflow:visible;">
[(#CLE|match{mail|sujet|texte}|oui)
<div class="choix">
<input type="text" name="champs[(#VAL{&#91;&#93;}|html_entity_decode)]" id="champ_#CLE" class="text" style="display:none;" value="#CLE" readonly='readonly' />
<input type="text" name="obligatoires[(#VAL{&#91;&#93;}|html_entity_decode)]" id="obli_#CLE" class="text" style="display:none;" value="#CLE" readonly='readonly' />
<label for="champ_#CLE">#VALEUR</label>
<label for="obli_#CLE"><em><:contact:champ_impose:></em></label>
</div>
][(#CLE|match{mail|sujet|texte}|non)
<div class="choix">
<input type="checkbox" name="champs[(#VAL{&#91;&#93;}|html_entity_decode)]" id="champ_#CLE" class="checkbox" value="#CLE"[ (#CLE|in_array{#ENV{champs,#ARRAY}}|oui)checked="checked"] />
<label for="champ_#CLE">#VALEUR</label>
</div>
<div class="choix">
<input type="checkbox" name="obligatoires[(#VAL{&#91;&#93;}|html_entity_decode)]" id="obli_#CLE" class="checkbox" value="#CLE"[ (#CLE|in_array{#ENV{obligatoires,#ARRAY}}|oui)checked="checked"] />
<label for="obli_#CLE"><:contact:champ_obligatoire:></label>
</div>
]
</li>
</BOUCLE_champs>
</ol>
</fieldset>
[(#PLUGIN{porte_plume,version}|>={1.5}|oui)
<fieldset>
<legend><:contact:configuration_champs_message:></legend>
[<p class="attention">(#EVAL{PORTE_PLUME_PUBLIC}|non|ou{#CONFIG{barre_outils_public}|=={non}|oui})<:contact:configuration_barre_impossible:></p>]
<ul>
<li class="editer_barre">
<label><:contact:configuration_champs_message_explication:></label>
<div class="choix">
<input type="radio" name="barre" id="no_b" class="radio" value="no_barre"[ checked="checked"(#ENV{barre}|=={no_barre}|ou{[(#CONFIG{contact/barre}|non)]}|oui)] />
<label for="no_b"><:contact:configuration_no_barre:></label>
</div>
<div class="choix">
<input type="radio" name="barre" id="bf" class="radio" value="inserer_barre_forum"[ checked="checked"(#ENV{barre}|=={inserer_barre_forum}|oui)] />
<label for="bf"><:contact:configuration_barre_forum:></label>
</div>
<div class="choix">
<input type="radio" name="barre" id="no_p" class="radio" value="no_previsualisation"[ checked="checked"(#ENV{barre}|=={no_previsualisation}|oui)] />
<label for="no_p"><:contact:configuration_no_previsualisation:></label>
</div>
<div class="choix">
<input type="radio" name="barre" id="b" class="radio" value=""[ checked="checked"(#ENV{barre}|non|et{[(#VAL{mail}|in_array{#CONFIG{contact/obligatoires,#ARRAY}}|oui)]})] />
<label for="b"><:contact:configuration_barre_oui:></label>
</div>
</li>
</ul>
</fieldset>
]
<fieldset>
<legend><:contact:configuration_pj:></legend>
<ul>
<li class="editer_autoriser_pj">
[(#REM) : On teste si le plugin facteur est présent pour pourvoir envoyer les pièces jointes ]
[(#PLUGIN{facteur}|oui)
<div class="choix">
<input type="checkbox" name="autoriser_pj" id="autoriser_pj" class="checkbox" value="true" [checked="checked"(#ENV{autoriser_pj}|=={true}|oui)] />
<label for="autoriser_pj"><:contact:configuration_pj_autoriser:></label>
</div>
<label for="nb_max_pj"><:contact:configuration_pj_nb_max:></label>
<select name="nb_max_pj" id="nb_max_pj">
<option value="1" [selected="selected" (#ENV{nb_max_pj}|=={1}|oui)]>1</option>
<option value="2" [selected="selected" (#ENV{nb_max_pj}|=={2}|oui)]>2</option>
<option value="3" [selected="selected" (#ENV{nb_max_pj}|=={3}|oui)]>3</option>
<option value="4" [selected="selected" (#ENV{nb_max_pj}|=={4}|oui)]>4</option>
<option value="5" [selected="selected" (#ENV{nb_max_pj}|=={5}|oui)]>5</option>
</select>
]
[(#PLUGIN{facteur}|non)
<p class="explication"><:contact:configuration_pj_facteur_absent:></p>
]
</li>
</ul>
</fieldset>
<fieldset>
<legend><:contact:champ_civilite:></legend>
<ul>
<li class="editer_champ_civi_mademoiselle">
<p class="explication"><:contact:champ_civi_explication:></p>
<div class="choix">
<input type="checkbox" name="champ_civi_mademoiselle" id="champ_civi_mademoiselle" class="checkbox" value="true" [checked="checked"(#ENV{champ_civi_mademoiselle}|=={true}|oui)] />
<label for="champ_civi_mademoiselle"><:contact:champ_civi_mademoiselle_ok:></label>
</div>
</li>
</ul>
</fieldset>
<fieldset>
<legend><:contact:sauv_message:></legend>
<ul>
<li class="editer_sauvegarder_contacts">
<p class="explication"><:contact:sauv_message_explication:></p>
<div class="choix">
<input type="checkbox" name="sauvegarder_contacts" id="sauvegarder_contacts" class="checkbox" value="true" [checked="checked"(#ENV{sauvegarder_contacts}|=={true}|oui)] />
<label for="sauvegarder_contacts"><:contact:sauv_message_ok:></label>
</div>
</li>
</ul>
</fieldset>
<fieldset>
<legend><:contact:configuration_intro:></legend>
<ul>
<li class="editer_texte pleine_largeur">
<p class="explication"><:contact:configuration_intro_explication:></p>
<textarea name="texte" id="texte" rows="10" cols="40">#ENV{texte}</textarea>
</li>
</ul>
</fieldset>
<fieldset>
<legend><:contact:configuration_texteinfolettre:></legend>
<ul>
<li class="editer_texteinfolettre pleine_largeur">
<p class="explication"><:contact:configuration_texteinfolettre_explication:></p>
<textarea name="texteinfolettre" id="texteinfolettre" rows="2" cols="40">[(#ENV{texteinfolettre})]</textarea>
</li>
</ul>
</fieldset>
<div class="boutons">
<input type="submit" name="_cfg_ok" value="<:bouton_enregistrer:>" class="submit" />
</div>
</div></form>
[ (#BOUTON_ACTION{<:contact:bouton_effacer:>,#URL_ACTION_AUTEUR{effacer_configuration,'contact',#SELF},ajax,<:contact:alerte_effacement:>})]
</div>
<script type="text/javascript">
;(function($){
var contact_sortable = function(){
$('ol#editer_champs')
.sortable({
cursor : 'move',
axis : 'y',
cancel : 'input, label',
forceHelperSize : true,
forcePlaceholderSize : true,
placeholder : 'cadre-couleur',
start : function(event, ui){
}
});
}
$(function(){
/*
$('div.selection').each(function(){
if ($('div.non input.radio').is(':checked'))
$(this).hide();
});
$('div.enf').hide();
$('div.enf input.radio:checked').each(function(){
$(this).parent('div').show();
$(this).parent('div').siblings('div.enf').show();
});
$('div.par input.radio:checked').each(function(){
$(this).parent('div').siblings('div.enf').show();
});
$('div div.par input.radio')
.click(function(){
if ($(this).is(':checked'))
$(this).parent('.par').siblings('div.enf')
.slideDown();
$('div div.par input.radio').not(':checked').parent('.par').siblings('div.enf')
.slideUp();
});
$('div.plus input.radio')
.click(function(){
if ($(this).is(':checked'))
$('div.selection')
.slideDown();
});
$('div.non input.radio')
.click(function(){
if ($(this).is(':checked'))
$('div.selection input.checkbox')
.attr('checked','');
$('div.selection')
.slideUp();
});
*/
/*$('li.editer_champ div').each(function(){
if (!$(this).siblings(':checkbox').is(':checked'))
$(this).hide();
});
$('li.editer_champ input.checkbox')
.click(function(){
if ($(this).is(':checked'))
$(this).siblings('div')
.slideDown();
else
$(this).siblings('div')
.slideUp();
});
*/
if(typeof($.fn.sortable) == 'undefined'){
$.getScript('#CHEMIN{javascript/contact_sortable.js}',function(){
contact_sortable();
});
}else{
contact_sortable();
}
});
})(jQuery);
</script>

@ -0,0 +1,151 @@
#CACHE{0}
<div class="formulaire_spip formulaire_contact formulaire_editer_message_contact" id="formulaire_contact">
<br class='bugajaxie' />
[<div class="texte">(#CONFIG{contact/texte}|propre)</div>]
[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
<BOUCLE_editable(CONDITION){si #ENV{editable}}>
<form method='post' action='#ENV{action}#formulaire_contact' enctype='multipart/form-data'>
[(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ]
#ACTION_FORMULAIRE{#ENV{action}}
[(#REM) Previsualisation... ]
<BOUCLE_previsu(CONDITION){si #ENV*{erreurs}|table_valeur{previsu}|oui}>
<fieldset class="previsu">
<legend><:previsualisation:></legend>
<ul>
[<li><strong><:contact:courriel_de:></strong> : (#ENV{mail})</li>]
<BOUCLE_previsu_infos(POUR){tableau #ENV{_champs}}>
[(#CLE|match{mail|sujet|texte}|non)
[<li><strong>[(#VALEUR)]</strong> : (#ENV{#CLE})</li>]
]
</BOUCLE_previsu_infos>
[<li><strong><:form_prop_sujet:></strong> : (#ENV{sujet})</li>]
[<li><div><strong><:info_texte_message:></strong></div>(#ENV{texte}|propre)</li>]
<B_previsu_pj>
<li>
[<strong>(#ENV{erreurs}|table_valeur{infos_pj}|count|>{1}|?{<:contact:form_pj_previsu_pluriel:>,<:contact:form_pj_previsu_singulier:>})</strong>]
<ul>
<BOUCLE_previsu_pj(POUR){tableau #ENV{erreurs}|table_valeur{infos_pj}}>
<li>
[<img src="(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{vignette}|image_reduire{32}|extraire_attribut{src})" [title="(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{mime})"] />]
[(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{nom})]
</li>
</BOUCLE_previsu_pj>
</ul>
</li>
</B_previsu_pj>
</ul>
<p class="boutons"><input type="submit" class="submit" name="confirmer" value="<:form_prop_confirmer_envoi:>" /></p>
</fieldset>
</BOUCLE_previsu>
[(#REM) Sinon, formulaire normal ]
<fieldset>
<legend><:envoyer_message:></legend>
<ul>
<BOUCLE_choix(CONDITION){si #ENV{choix_destinataires}|non}>
[(#REM) Si pas de choix, le destinataire est défini automatiquement ]
<BOUCLE_tous(POUR){tableau #ENV{destinataire}}>
<li style="display:none;"><input type="hidden" name="destinataire[]" value="#VALEUR" /></li>
</BOUCLE_tous>
</BOUCLE_choix>
[(#REM) Sinon on propose le choix, en select ou en checkbox suivant l'option "type_choix" ]
<B_destinataires>
<li class="obligatoire[ (#ENV*{erreurs}|table_valeur{destinataire}|oui)erreur]">
[(#ENV{type_choix}|match{plusieurs|plusieurs_et|plusieurs_ou}|oui)
<label><:contact:form_destinataires:></label>
[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{destinataire})</span>]
<ul class="choix_mots">
]
[(#ENV{type_choix}|match{un|un_et|un_ou}|oui)
<label for="destinataire"><:contact:form_destinataire:></label>
[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{destinataire})</span>]
<select name="destinataire&#91;&#93;" id="destinataire">
]
<BOUCLE_destinataires(AUTEURS){tous}{id_auteur IN #ENV**{choix_destinataires}}{par num nom,nom}>
[(#ENV{type_choix}|match{plusieurs|plusieurs_et|plusieurs_ou}|oui)
<li class="choix">
<input
type="checkbox" class="checkbox"
name="destinataire&#91;&#93;" id="destinataire#ID_AUTEUR"
value="#ID_AUTEUR"[(#ENV{destinataire_selection}|oui)[ (#ID_AUTEUR|in_array{#ENV*{destinataire_selection,#ARRAY}}|oui)checked="checked"]]
[(#ENV{destinataire_selection}|non)
[(#CONFIG{contact/c}|non)[ (#ID_AUTEUR|in_array{#ENV*{destinataire,#ARRAY}}|ou{[(#ID_AUTEUR|in_array{#ENV*{choix_destinataires,#ARRAY}})]}|oui)checked="checked"]]]
/>
<label for="destinataire#ID_AUTEUR">#NOM</label>
</li>
]
[(#ENV{type_choix}|match{un|un_et|un_ou}|oui)
<option value="#ID_AUTEUR"[ (#ID_AUTEUR|in_array{#ENV*{destinataire,#ARRAY}}|oui)selected="selected"]>#NOM</option>
]
</BOUCLE_destinataires>
[(#ENV{type_choix}|match{plusieurs|plusieurs_et|plusieurs_ou}|oui)
</ul>
]
[(#ENV{type_choix}|match{un|un_et|un_ou}|oui)
</select>
]
</li>
</B_destinataires>
BUG
<//B_destinataires>
<//B_choix>
<BOUCLE_infos(POUR){tableau #ENV{_champs}}>
#SET{existe, #CHEMIN{formulaires/contact_champ_#CLE.html}}
[(#GET{existe}|oui)
[(#INCLURE{fond=formulaires/contact_champ_#CLE,env,name=#CLE,titre=#VALEUR})]
]
[(#GET{existe}|non)
<li class="editer_#CLE saisie_#CLE[ (#CLE|in_array{#ENV{_obligatoires,#ARRAY}}|oui)obligatoire][ (#ENV*{erreurs}|table_valeur{#CLE}|oui)erreur]">
<label for="info_#CLE">#VALEUR[ (#CLE|in_array{#ENV{_obligatoires,#ARRAY}}|oui)<strong><:info_obligatoire_02:></strong>]</label>
[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{#CLE})</span>]
<input type="text" class="text" name="#CLE" id="info_#CLE" value="#ENV{#CLE}" size="30" />
</li>
]
</BOUCLE_infos>
<B_pj>
<li class ='pieces_jointes'>
<label>[(#ENV{nb_max_pj}|>{1}|?{<:contact:form_pj_ajouter_pluriel:>,<:contact:form_pj_ajouter_singulier:>})]</label>
<ul>
<BOUCLE_pj(POUR){tableau #ENV{pj_fichiers}}>
<li>
[(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{message}|oui)
<:contact:form_pj_fichier_ajoute:>
[<img src="(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{vignette}|image_reduire{32}|extraire_attribut{src})" [title="(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{mime})"] />]
[(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{nom})]
<input type="hidden" name="pj_enregistrees_nom&#91;#CLE&#93;" value="[(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{nom})]"/>
<input type="hidden" name="pj_enregistrees_mime&#91;#CLE&#93;" value="[(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{mime})]"/>
<input type="hidden" name="pj_enregistrees_extension&#91;#CLE&#93;" value="[(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{extension})]"/>
<input type="hidden" name="pj_enregistrees_vignette&#91;#CLE&#93;" value="[(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{vignette})]"/>
<input type="submit" name="pj_supprimer_#CLE" value="<:contact:form_pj_supprimer:>"/>
]
[(#ENV*{erreurs}|table_valeur{infos_pj}|table_valeur{#CLE}|table_valeur{message}|non)
<input type="file" class="fichier" name="pj_fichiers&#91;#CLE&#93;" title="<:contact:form_pj_importer:>" />
]
</li>
</BOUCLE_pj>
</ul>
</li>
</B_pj>
</ul>
</fieldset>
[(#REM) Piege a robots spammeurs ]
<p style="display:none;">
<label for="contact_nobot"><:antispam_champ_vide:></label>
<input type="text" class="text" name="nobot" id="contact_nobot" value="#ENV{nobot}" size="10" />
</p>
<p class="boutons"><input type="submit" class="submit" name="valide" value="<:form_prop_envoyer:>" /></p>
</form>
</BOUCLE_editable>
</div>

@ -0,0 +1,396 @@
<?php
include_spip('inc/config');
include_spip('configurer/pipelines');
function formulaires_contact_charger_dist($id_auteur='',$tracer=''){
$valeurs = array();
$valeurs['destinataire'] = array();
$valeurs['choix_destinataires'] = '';
// La liste dans laquelle on pourra éventuellement choisir
$choix_destinataires = ($tmp = lire_config('contact/choix_destinataires')) ? $tmp : array();
$choix_destinataires = array_map('intval',$choix_destinataires);
// tableau des type_choix necessitant la prise en compte de $id_auteur
$t_c = array('tous_et', 'tous_ou', 'un_et', 'un_ou', 'plusieurs_et', 'plusieurs_ou');
$valeurs['type_choix'] = $type_choix = lire_config('contact/type_choix');
if( in_array($type_choix,$t_c) ){
if(!is_array($id_auteur)){
$id_auteur = explode(',',$id_auteur);
if(!is_numeric($id_auteur[0]))$id_auteur=array();
}
}
$nb_d = count($choix_destinataires);
// Rien n'a été défini, on utilise l'auteur 1
if ($nb_d == 0){
$valeurs['destinataire'][] = 1;
}else{
$valeurs['destinataire'] = $choix_destinataires;
}
if ($type_choix == 'tous_ou' and $id_auteur){
$valeurs['destinataire'] = $id_auteur;
}else if ($type_choix == 'tous_et' and $id_auteur){
$valeurs['destinataire'] = array_unique(array_merge($valeurs['destinataire'],$id_auteur));
}else if (($type_choix == 'un' or $type_choix == 'plusieurs') and $nb_d>1){
$valeurs['choix_destinataires'] = $valeurs['destinataire'];
}else if ($type_choix == 'un_et' or $type_choix == 'plusieurs_et'){
$c_d = array_unique(array_merge($valeurs['destinataire'],$id_auteur));
if(count($c_d)>1){
$valeurs['choix_destinataires'] = $c_d;
}else{
$valeurs['destinataire'] = $c_d;
}
}else if ($type_choix == 'un_ou' or $type_choix == 'plusieurs_ou'){
if(count($id_auteur)>1){
$valeurs['choix_destinataires'] = $id_auteur;
}elseif(count($id_auteur)==1){
$valeurs['destinataire'] = $id_auteur;
}elseif(count($valeurs['destinataire'])>1){
$valeurs['choix_destinataires'] = $valeurs['destinataire'];
}
}
$valeurs['destinataire_selection'] = _request('destinataire');
// Les infos supplémentaires
$champs_possibles = contact_infos_supplementaires();
$champs_mini_config = array('mail', 'sujet', 'texte');
$champs_choisis = lire_config('contact/champs',$champs_mini_config);
// On envoie un tableau contenant tous les champs choisis et leur titre
// DANS L'ORDRE de ce qu'on a récupéré de CFG
$champs_choisis = array_flip($champs_choisis);
foreach ($champs_choisis as $cle => $valeur){
$champs_choisis[$cle] = $champs_possibles[$cle];
}
$valeurs['_champs'] = $champs_choisis;
// Mais aussi tous les champs un par un
$valeurs = array_merge(
$valeurs,
array_map(
create_function('', 'return "";'),
$champs_choisis
)
);
$valeurs['_obligatoires'] = $champs_obligatoires = lire_config('contact/obligatoires',$champs_mini_config);
// Infos sur l'ajout de pièces jointes ou non
$autoriser_pj = (lire_config('contact/autoriser_pj') == 'true');
$valeurs['autoriser_pj'] = $autoriser_pj;
// Si on autorise les pièces jointes, on regarde quel est le nombre max de pj.
if ($autoriser_pj) {
$nb_max_pj = lire_config('contact/nb_max_pj');
$valeurs['nb_max_pj'] = $nb_max_pj;
// On pré-remplit un tableau pour pouvoir boucler dessus le bon nombre de fois
$valeurs['pj_fichiers'] = array_fill(0, $nb_max_pj, '');
}
//Sert à stocker les informations des fichiers plus ou moins bien uploadés lorsqu'il y a des erreurs.
$valeurs['pj_nom_enregistrees'] = array();
$valeurs['pj_cle_enregistrees'] = array();
$valeurs['pj_mime_enregistrees'] = array();
return $valeurs;
}
function formulaires_contact_verifier_dist($id_auteur='',$tracer=''){
$erreurs = array();
include_spip('inc/filtres');
include_spip('inc/documents');
include_spip('inc/charsets');
if($tracer){
$trace=explode('-',$tracer);
if( !(count($trace)==2) or !(intval($trace[1])>0) ){
$erreurs['message_erreur'] = 'Une erreur de transmission s\'est produite, merci de renouveller vôtre demande.';
}
}
if (!_request('destinataire'))
$erreurs['destinataire'] = _T("info_obligatoire");
if (!$adres = _request('mail'))
$erreurs['mail'] = _T("info_obligatoire");
elseif(!email_valide($adres))
$erreurs['mail'] = _T('form_prop_indiquer_email');
$champs_mini_config = array('mail', 'sujet', 'texte');
$champs_choisis = lire_config('contact/champs',$champs_mini_config );
$champs_obligatoires = lire_config('contact/obligatoires',$champs_mini_config);
if (is_array($champs_choisis) and is_array($champs_obligatoires)){
foreach($champs_choisis as $champ){
if (!_request($champ) and in_array($champ, $champs_obligatoires))
$erreurs[$champ] = _T("info_obligatoire");
}
}
if(!(strlen(_request('sujet'))>3))
$erreurs['sujet'] = _T('forum_attention_trois_caracteres');
$texte_min = !defined('_TEXTE_MIN')?10:_TEXTE_MIN;
if(!(strlen(_request('texte'))>$texte_min) && !$erreurs['texte'])
$erreurs['texte'] = _T('contact:forum_attention_nbre_caracteres',array('nbre_caract'=>$texte_min));
if ($nobot=_request('nobot'))
$erreurs['nobot'] = 'Vous êtes un robot. Méchant robot.';
// On s'occupe des pièces jointes.
$pj_fichiers = $_FILES['pj_fichiers'];
//Si le répertoire temporaire n'existe pas encore, il faut le créer.
$repertoire_temp_pj = _DIR_TMP.'/contact_pj/';
if (!is_dir($repertoire_temp_pj)) mkdir($repertoire_temp_pj);
//Pour les nouvelles pj uploadées
if ($pj_fichiers != null) {
foreach ($pj_fichiers['name'] as $cle => $nom_pj) {
// On commence par transformer le nom du fichier pour éviter les conflits
$nom_pj = trim(preg_replace('/[\s]+/', '_', strtolower(translitteration($nom_pj))));
// Si le fichier a bien un nom et qu'il n'y a pas d'erreur associé à ce fichier
if (($nom_pj != null) && ($pj_fichiers['error'][$cle] == 0)) {
//On vérifie qu'un fichier ne porte pas déjà le même nom, sinon on lui donne un nom aléatoire + nom original
if (file_exists($repertoire_temp_pj.$nom_pj))
$nom_pj = $nom_pj.'_'.rand();
//déplacement du fichier vers le dossier de réception temporaire
if (move_uploaded_file($pj_fichiers['tmp_name'][$cle], $repertoire_temp_pj.$nom_pj)) {
$infos_pj[$cle]['message'] = 'ajout fichier';
$infos_pj[$cle]['nom'] = $nom_pj;
// On en déduit l'extension et du coup la vignette
$infos_pj[$cle]['extension'] = strtolower(preg_replace('/^.*\.([\w]+)$/i', '$1', $nom_pj));
if (function_exists('vignette_par_defaut'))
$vignette = 'vignette_par_defaut';
else
$vignette = charger_fonction('vignette', 'inc');
$infos_pj[$cle]['vignette'] = $vignette($infos_pj[$cle]['extension'], false, true);
//On récupère le tye MIME du fichier aussi
$infos_pj[$cle]['mime'] = $pj_fichiers['type'][$cle];
}
}
}
}
//Pour les pj qui ont déjà été récupérées avec succes, on remet le tableau des informations sur les pj à jour
$pj_enregistrees_nom = _request('pj_enregistrees_nom');
$pj_enregistrees_mime = _request('pj_enregistrees_mime');
$pj_enregistrees_extension = _request('pj_enregistrees_extension');
$pj_enregistrees_vignette = _request('pj_enregistrees_vignette');
if (is_array($pj_enregistrees_nom))
foreach ($pj_enregistrees_nom as $cle => $nom){
$infos_pj[$cle]['message'] = 'ajout fichier';
$infos_pj[$cle]['nom'] = $nom;
$infos_pj[$cle]['mime'] = $pj_enregistrees_mime[$cle];
$infos_pj[$cle]['extension'] = $pj_enregistrees_extension[$cle];
$infos_pj[$cle]['vignette'] = $pj_enregistrees_vignette[$cle];
}
//Maintenant on vérifie s'il n'y a pas eu une suppression de fichiers
$nb_max_pj = lire_config('contact/nb_max_pj');
for ($cle=0 ; $cle<$nb_max_pj ; $cle++) {
if (_request('pj_supprimer_'.$cle)) {
//On récupère le nom de la pièce jointe à supprimer
$nom_pj_supprimer = $infos_pj[$cle]['nom'];
//On supprime le fichier portant ce nom
unlink($repertoire_temp_pj.$nom_pj_supprimer);
//On re-propose la possibilité de télécharger un fichier en supprimant les infos du fichier
unset($infos_pj[$cle]);
}
}
// Si on est pas dans une confirmation et qu'il n'y pas de vraies erreurs on affiche la prévisu du message
if (!_request('confirmer') AND !count($erreurs))
$erreurs['previsu']=' ';
// Si on est pas dans une confirmation, on ajoute au contexte les infos des fichiers déjà téléchargés
if (!_request('confirmer'))
$erreurs['infos_pj'] = $infos_pj;
return $erreurs;
}
function formulaires_contact_traiter_dist($id_auteur='',$tracer=''){
include_spip('base/abstract_sql');
include_spip('inc/texte');
$infos = '';
// On récupère à qui ça va être envoyé
$destinataire = _request('destinataire');
if (!is_array($destinataire))
$destinataire = array($destinataire);
$destinataire = array_map('intval', $destinataire);
$mail = sql_allfetsel(
'email',
'spip_auteurs',
'id_auteur IN ('.join(', ', $destinataire).')'
);
$mail = array_map('reset', $mail);
// S'il n'y a pas le plugin facteur, on met l'(es) adresse(s) sous forme de chaine de caractères.
if (!defined("_DIR_PLUGIN_FACTEUR"))
$mail = join(', ', $mail);
// Les infos supplémentaires
$champs_possibles = contact_infos_supplementaires();
$champs_mini_config = array('mail', 'sujet', 'texte');
$champs_choisis = lire_config('contact/champs',$champs_mini_config);
if (is_array($champs_choisis)){
foreach($champs_choisis as $champ){
if ($reponse_champ = _request($champ)){
if( ($champ=='mail') OR ($champ=='sujet') OR ($champ=='texte') ){
$posteur[$champ] = $reponse_champ;
}else{
$infos .= "\n".$champs_possibles[$champ]." : ".$reponse_champ;
}
}
}
}
if($tracer){
$trace=explode('-',$tracer);
if( (count($trace)==2) and (intval($trace[1])>0) ){
$url = generer_url_entite(intval($trace[1]),$trace[0]);
if($url){
$inforigine= $GLOBALS['meta']['adresse_site']."/".$url;
}else{
$inforigine= 'info trace non comprise';
}
}else{
$inforigine= 'info trace non comprise';
}
$inforigine= _T('contact:inforigine')."\n".$inforigine."\n\n";
}
// horodatons
$horodatage = affdate_heure (date ("Y-m-d H:i:s"));
$horodatage = "\n\n"._T('contact:horodatage', array('horodatage'=>$horodatage))."\n\n";
$par = _T('contact:par').$posteur['mail']."\n\n";
$texte = $horodatage.$par.$inforigine.$infos."\n\n".$posteur['texte'];
$nom_site = supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site']));
$texte .= "\n\n "._T('envoi_via_le_site')." ".$nom_site." ( ".$GLOBALS['meta']['adresse_site']."/ ) \n";
// Texte a envoyer par mail, sans raccourcis SPIP
// On évite de couper les urls
define('_MAX_LONG_URL',100000);
define('_MAX_COUPE_URL',100000);
$texte_final = propre($texte);
// Eviter que le facteur machouille les apostrophes
if ($GLOBALS['meta']['facteur_filtre_iso_8859']){
$texte_final = preg_replace(',&#8217;,',"'",$texte_final);
}
// Sauvegarder un soupcon de liste dans le mail
$texte_final = preg_replace (array('/<li>/','/<\/li>/','/<\/ul>/'), array("- ","\n","\n"), $texte_final);
$texte_final = supprimer_tags($texte_final);
// On formate pour les accents
// Texte a mettre en base
$texte = filtrer_entites($texte);
// On va vérifie s'il y a des pièces jointes
$pj_enregistrees_nom = _request('pj_enregistrees_nom');
$pj_enregistrees_mime = _request('pj_enregistrees_mime');
$pj_enregistrees_extension = _request('pj_enregistrees_extension');
$repertoire_temp_pj = _DIR_TMP.'/contact_pj/';
// Si oui on les ajoute avec le plugin Facteur
if ($pj_enregistrees_nom != null) {
//On rajoute des sauts de ligne pour différencier du message.
$texte_final = array(
'texte' => $texte_final
);
foreach ($pj_enregistrees_nom as $cle => $nom_pj) {
$texte_final['pieces_jointes'][$cle] = array(
'chemin' => $repertoire_temp_pj.$nom_pj,
'nom' => $nom_pj,
'encodage' => 'base64',
'mime' => $pj_enregistrees_mime[$cle]
);
}
}
// Enregistrement des messages en base de données si on l'a demandé
if (lire_config('contact/sauvegarder_contacts')) {
// Il s'agit d'un visiteur : on va donc l'enregistrer dans la table auteur pour garder son mail.
// Sauf s'il existe déjà.
$id_aut = sql_getfetsel(
'id_auteur',
'spip_auteurs',
'email = '.sql_quote($posteur['mail'])
);
if (!$id_aut){
$nom_auteur = trim(_request('prenom').' '._request('nom'));
if (!$nom_auteur) $nom_auteur = $posteur['mail'];
$id_aut = sql_insertq(
'spip_auteurs',
array(
'nom' => $nom_auteur,
'email' => $posteur['mail'],
'statut' => 'contact'
)
);
}
// Ensuite on ajoute le message dans la base
$id_message = sql_insertq(
'spip_messages',
array(
'titre' => $posteur['sujet'],
'statut' => 'publie',
'type' => 'contac',
'id_auteur' => $id_aut,
'date_heure' => date('Y-m-d H:i:s'),
'texte' => $texte,
'rv' => 'non'
)
);
// S'il y a des pièces jointes on les ajoute aux documents de SPIP.
if ($pj_enregistrees_nom != null) {
//On charge la fonction pour ajouter le document là où il faut
$ajouter_document = charger_fonction('ajouter_documents', 'inc');
foreach ($pj_enregistrees_nom as $nom_pj) {
$id_doc = $ajouter_document($repertoire_temp_pj.$nom_pj, $nom_pj, 'message', $id_message, 'document', $id_document, $titrer=false);
}
}
// On lie le message au(x) destinataire(s) concerné(s)
foreach ($destinataire as $id_destinataire) {
sql_insertq(
'spip_auteurs_messages',
array(
'id_auteur' => $id_destinataire,
'id_message' => $id_message,
'vu' =>'non')
);
}
$memoire = generer_url_ecrire('contact_un_message', 'id_message='.$id_message);
if ($pj_enregistrees_nom != null) {
$texte_final['texte'] .= "\n\n"._T('contact:consulter_memoire')."\n".$memoire;
}
else{
$texte_final .= "\n\n"._T('contact:consulter_memoire')."\n".$memoire;
}
}
// envoyer le mail maintenant
$envoyer_mail = charger_fonction('envoyer_mail','inc');
$envoyer_mail($mail, $posteur['sujet'], $texte_final, $posteur['mail'], "X-Originating-IP: ".$GLOBALS['ip']);
// Maintenant que tout a été envoyé ou enregistré, s'il y avait des PJ il faut supprimer les fichiers
if ($pj_enregistrees_nom != null) {
foreach ($pj_enregistrees_nom as $cle => $nom_pj) {
unlink($repertoire_temp_pj.$nom_pj);
}
}
$message = _T('contact:succes', array("equipe_site" => $nom_site));
return array('message_ok'=>$message);
}
?>

@ -0,0 +1,23 @@
<li class="[editer_(#ENV{name})][ saisie_(#ENV{name})][ (#GET{#ENV{name}})][ (#ENV**{erreurs}|table_valeur{#ENV{name}}|oui)erreur]">
<fieldset>
<legend><:contact:champ_civilite:>[<span class="obligatoire">(#GET{#ENV{name}}|oui)*</span>]</legend>
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{#ENV{name}})</span>]
<div class='choix'>
<label for="#ENV{name}_madame">
<input type='radio' class='radio' name='#ENV{name}' id='#ENV{name}_madame' value="madame"[ (#ENV{#ENV{name}}|=={madame}|oui)checked="checked"] />
<:contact:madame:></label>
</div>
[(#CONFIG{contact/champ_civi_mademoiselle}|=={true}|oui)
<div class='choix'>
<label for="#ENV{name}_mademoiselle">
<input type='radio' class='radio' name='#ENV{name}' id='#ENV{name}_mademoiselle' value="mademoiselle"[ (#ENV{#ENV{name}}|=={mademoiselle}|oui)checked="checked"] />
<:contact:mademoiselle:></label>
</div>
]
<div class='choix'>
<label for="#ENV{name}_monsieur">
<input type='radio' class='radio' name='#ENV{name}' id='#ENV{name}_monsieur' value="monsieur"[ (#ENV{#ENV{name}}|=={monsieur}|oui)checked="checked"] />
<:contact:monsieur:></label>
</div>
</fieldset>
</li>

@ -0,0 +1,8 @@
<li class="[editer_(#ENV{name})][ saisie_(#ENV{name})][ (#ENV**{erreurs}|table_valeur{#ENV{name}}|oui)erreur]">
[<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{#ENV{name}})</span>]
<div class='choix'>
<label for="#ENV{name}">
<input type='checkbox' class='checkbox' name='#ENV{name}' id='#ENV{name}' value="oui"[ (#ENV{#ENV{name}}|=={oui}|oui)checked="checked"] />
&nbsp;[(#CONFIG{contact/texteinfolettre}|sinon{<:contact:informez_moi:>})]</label>
</div>
</li>

@ -0,0 +1,5 @@
<li class='editer_mail saisie_mail obligatoire[ (#ENV*{erreurs}|table_valeur{mail}|oui)erreur]'>
<label for="mail"><:form_pet_votre_email:> <strong><:info_obligatoire_02:></strong></label>
[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{mail})</span>]
<input type="text" class="text" name="mail" id="mail" value="#ENV{mail}" size="30" />
</li>

@ -0,0 +1,5 @@
<li class='editer_texte saisie_texte obligatoire[ (#ENV*{erreurs}|table_valeur{texte}|oui)erreur]'>
<label for="contact_texte"><:info_texte_message:> <strong><:info_obligatoire_02:></strong></label>
[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{texte})</span>]
<textarea name="texte" id="contact_texte" rows="8" cols="60"[ class="(#CONFIG{contact/barre})"]>#ENV{texte}</textarea>
</li>

Binary file not shown.

After

Width:  |  Height:  |  Size: 896 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 854 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 373 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 385 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 316 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 321 B