en_tete.html, ajout de
<div id="mes_formulaires"><a href="#URLFOND(contact)">Contact</a></div>
meta.html, ajout de
<script type="text/javascript">
// <![CDATA[
$(document).ready(function(){
$('#mes_formulaires a').click(function(){
var url=$(this).attr('href');
$('#mon_formulaire').html("Chargement en cours...").slideDown(500);
$.post(url, function(result){
afficheForm(result);
});
return false;
});
function afficheForm(result){
var mon_formulaire = $(result).find('#mon_formulaire');
$('#mon_formulaire').html(mon_formulaire);
$('#mon_formulaire form').submit(function() {
$('#mon_formulaire').html("Traitement en cours...");
$.ajax({
url: $(this).attr('action'), // le nom du fichier indiqué dans le formulaire
type: $(this).attr('method'), // la méthode indiquée dans le formulaire (get ou post)
data: $(this).serialize(), // je sérialise les données
success: function(result) { // je récupère la réponse du fichier
afficheForm(result); // j'affiche la réponse
}
});
return false; // j'empêche le navigateur de soumettre lui-même le formulaire
});
//si tu as un bouton pour fermer le formulaire :
$('#mon_formulaire .fermer').click(function() {
$('#mon_formulaire').slideUp(400,function(){
$(this).html('');
});
});
}
});
// ]]>
</script>
menu.html, ajout de
<div id="mon_formulaire"></div>
contact.html
<div id="contenu">
<div id="mon_formulaire">
<TEST_form_ok variable="#ENV{contactok,0}" test="egal" valeur="1">
<p>Merci !</p>
<p>Votre message a été transmis à notre équipe,
qui prendra contact avec vous dans les plus brefs délais.</p>
</TEST_form_ok>
<FORMULAIRE_contact titre="Formulaire de contact" traitement="email:#VARIABLE(emailcontact)" urlsucces="#URLFOND(contact,contactok=1)" url="#URLFOND(contact)" method="post" class="formulaire" id="contact">
#ERREUR_SAISIE[<div class="form-erreur message-erreur"><span class="etoile">Merci d'indiquer les informations indispensables !</span></div>]
<div class="formline">
<label class="infos-obligatoire"><span class="rouge">Informations indispensables</span> <span class="etoile">*</span></label>
</div>
<div class="formline">
<label class="#NOM[erreur]" for="nom">Votre Nom Prénom <span class="etoile">*</span> :</label>
<input #NOM[class="erreur"] type="text" name="nom|o" id="nom" value="#NOM" size="50" />
</div>
<div class="formline">
<label class="#EMAIL[erreur]" class="obligatoire" for="email">Votre adresse E-mail <span class="etoile">*</span> :</label>
<input #EMAIL[class="erreur"] type="text" name="email|o|email|Adresse e-mail" id="email" value="#EMAIL" size="80" />
</div>
<div class="formline">
<label class="#TELEPHONE[erreur]" for="telephone">Téléphone :</label>
<input #TELEPHONE[class="erreur"] type="text" name="telephone|f||Téléphone" id="telephone" value="#TELEPHONE" />
</div>
<div class="formline">
<label class="#FICHIER[erreur]" for="fichier">Fichier :</label>
<input #FICHIER[class="erreur"] type="file" name="fichier|f|fichier|Fichier" id="fichier" value="#FICHIER" />
</div>
<div class="formline">
<label class="#MESSAGE[erreur]" for="message">Vos commentaires, suggestions ou questions <span class="etoile">*</span></label><br />
<textarea #MESSAGE[class="erreur"] rows="8" cols="80" name="message|o||Message" id="message">#MESSAGE</textarea>
</div>
<div class="formline">
<label for="code">Pour la lutte anti-robot, saisissez le code ci-dessous pour valider votre message <span class="etoile">*</span></label>
<!-- Changer d'image à la volée si elle est illisible -->
<ul>
<li>Vous voulez changer ce code, cliquez :<a style="cursor:pointer" onclick="document.images.captcha.src='#CODE_URL_CHANGER_IMAGE'"> <strong class="rouge">> ICI <</strong></a></li>
<li><img src="#CODE_URL_IMAGE" alt="Captcha" id="captcha" /></li>
<li><input type="text" id="code" class="#CODE[form-erreur]" name="code|o|captcha" /></li>
</ul>
</div>
<div class="formline">
<p> </p>
<button type="submit">Envoyer</button>
</div>
</FORMULAIRE_contact>
<//TEST_form_ok>
</div>
</div>
NB : perso je préférerai inclure tout le html dans cette page pour permette d'y accéder directement. Dans ce cas, il faut voir pour éviter les doublons d'id
Formesmagiques.class.php
<?php
include_once(realpath(dirname(__FILE__)) . "/../../../classes/PluginsClassiques.class.php");
include_once(realpath(dirname(__FILE__)) . "/../../../classes/Message.class.php");
include_once(realpath(dirname(__FILE__)) . "/../../../classes/Messagedesc.class.php");
include_once(realpath(dirname(__FILE__)) . "/../../../classes/Variable.class.php");
include_once(realpath(dirname(__FILE__)) . "/classes/DescripteurForme.class.php");
include_once(realpath(dirname(__FILE__)) . "/classes/Formulaire.class.php");
include_once(realpath(dirname(__FILE__)) . "/classes/FormulaireInstance.class.php");
include_once(realpath(dirname(__FILE__)) . "/classes/FormulaireChamp.class.php");
class Formesmagiques extends PluginsClassiques
{
const VERSION = '0.6.2';
const MODULE = 'formesmagiques';
const NOMMODULE = 'Formesmagiques';
const PREFIXE = 'frmg_';
public $id;
public $type;
public $idobjet;
public $alias;
public $erreur = false;
const TABLE = "formesmagiques";
public $table=self::TABLE;
var $bddvars = array('id', 'type', 'idobjet', 'alias');
private $upload_dir;
public function __construct()
{
parent::__construct(self::MODULE);
$this->upload_dir = realpath(dirname(__FILE__)) . '/upload';
}
function init()
{
$this->ajout_desc(
self::NOMMODULE,
"Plugin Formes Magiques",
"Ce plugin permet de créer très simplement des formulaires expédiés par email et/ou stockés en base de donnée",
1);
if (! (is_dir($this->upload_dir) || mkdir($this->upload_dir, 0777, true))) {
die("Ne peut créer le dossier de stockage des fichiers $this->upload_dir. Merci de vérifier les permissions.");
}
$fo = new Formulaire;
$fo->init();
$fi = new FormulaireInstance();
$fi->init();
$fc = new FormulaireChamp();
$fc->init();
$message = new Message();
if (! $message->charger("envoiformulaire")) {
$message->nom = "envoiformulaire";
$lastid = $message->add();
$messagedesc = new Messagedesc();
$messagedesc->message = $lastid;
$messagedesc->intitule = "Message d'envoi de formulaire Formes Magiques";
$messagedesc->lang = 1;
$messagedesc->titre = "Envoi du formulaire __TITRE_FORMULAIRE__";
$messagedesc->chapo = "";
$messagedesc->descriptiontext = "
Bonjour,
Le formulaire __TITRE_FORMULAIRE__ a été envoyé à votre intention le __DATE_ENVOI__ à __HEURE_ENVOI__ depuis l'adresse IP __IP_ENVOI__. Les informations indiquées sont les suivantes :
<CHAMPS>
- __CHAMP_LABEL__ : __CHAMP_VALEUR__
</CHAMPS>
Bonne journée.
";
$messagedesc->description = "
<p>Bonjour,</p>
<p>Le formulaire __TITRE_FORMULAIRE__ a été envoyé à votre intention le __DATE_ENVOI__ à __HEURE_ENVOI__ depuis l'adresse IP __IP_ENVOI__. Les informations indiquées sont les suivantes :</p>
<ul>
<CHAMPS>
<li> __CHAMP_LABEL__ : __CHAMP_VALEUR__</li>
</CHAMPS>
</ul>
<p>Bonne journée.</p>
";
$messagedesc->add();
}
}
function destroy()
{
// $this->query("DROP TABLE `".self::TABLE."`");
}
public function traiter_formulaire($formdesc) {
list($nomaction, $parametres) = explode(':', $formdesc->action);
$nomaction = strtolower($nomaction);
if ($nomaction == 'email') {
$this->traiter_formulaire_email($formdesc, $parametres);
}
else {
die("Action '$action' inconnue pour la form $formdesc->nom");
}
}
private function traiter_formulaire_bdd($formdesc, $parametres) {
$form = new Formulaire();
if (! $form->charger($formdesc->nom)) {
$form->nom = $formdesc->nom;
$form->add();
$form->charger($formdesc->nom);
}
$instance = new FormulaireInstance();
$instance->formulaire = $form->id;
$instance->date = time();
$instance->ip = $_SERVER[REMOTE_ADDR];
$instance->lu = false;
$id = $instance->add();
foreach($formdesc->champs as $champ) {
// Ignorer les captchas
if ($champ->type == DescripteurChamp::TYPE_CAPTCHA) continue;
$bd = new ChampInstance();
$bd->instance = $id;
$bd->nom = $champ->formvar;
$bd->label = $champ->label;
$bd->valeur = $champ->valeur;
$bd->add();
}
}
private function traiter_formulaire_email($formdesc, $parametres) {
$adresses = explode(',', $parametres);
$message = new Message("envoiformulaire");
$md = new Messagedesc($message->id);
$sujet = $this->substitutions_email($md->titre, $formdesc);
$texte = $this->substitutions_email($md->descriptiontext, $formdesc);
$textehtml = $this->substitutions_email($md->description, $formdesc);
foreach($adresses as $adresse) {
$res = Mail::envoyer(
$adresse, $adresse,
Variable::lire('nomsite'), Variable::lire('emailfrom'),
$sujet,
$textehtml,
$texte
);
}
}
private function substitutions_email($texte, $formdesc) {
$texte = str_replace("__TITRE_FORMULAIRE__", $formdesc->nom, $texte);
$texte = str_replace("__DATE_ENVOI__", date("d/m/Y"), $texte);
$texte = str_replace("__HEURE_ENVOI__", date("H:i:s"), $texte);
$texte = str_replace("__IP_ENVOI__", $_SERVER['REMOTE_ADDR'], $texte);
if (preg_match_all("`<CHAMPS>(.+)</CHAMPS>`s", $texte, $matches, PREG_SET_ORDER)) {
foreach($matches as $match) {
$res = '';
foreach($formdesc->champs as $champ) {
if ($champ->type == DescripteurChamp::TYPE_CAPTCHA) continue;
$tmp = $match[1];
$tmp = str_replace("__CHAMP_NOM__", $champ->formvar, $tmp);
$tmp = str_replace("__CHAMP_LABEL__", $champ->label, $tmp);
$tmp = str_replace("__CHAMP_VALEUR__", $champ->valeur, $tmp);
$res .= $tmp;
}
$texte = str_replace($match[0], $res, $texte);
}
}
return $texte;
}
public function analyse() {
global $res;
$matches = array();
// Retrouver le texte réel de la boucle, qui est en fait occulté par le parser...
if (preg_match_all('`<FORMULAIRE_([^ ]+) ([^>]*)>(:?(.*))</FORMULAIRE_\1>`Us', $res, $matches, PREG_SET_ORDER)) {
foreach($matches as $match) {
$nom = $match[1];
$args = $match[2];
$formtexte = $match[3];
$sid = 'frm_'.$nom;
$formtags = array('titre', 'traitement', 'urlsucces', 'url');
$traitement = lireTag($args, "traitement"); // BD / EMAIL / THELIA:{connexion|nouveau}
$titre = lireTag($args, "titre");
$urlsucces = lireTag($args, "urlsucces");
$url = lireTag($args, "url");
// Compat 0.6.0
if (empty($traitement)) {
$traitement = lireTag($args, "action");
if (! empty($traitement)) {
$formtags[] = 'action';
}
}
$formdesc = new DescripteurForm();
$formdesc->sid = $sid;
$formdesc->nom = empty($titre) ? $nom : $titre;
$formdesc->action = $traitement != '' ? $traitement : 'bd';
$formdesc->urlsucces = str_replace("&", "&", $urlsucces);
$avec_file = false;
$inpmatches = array();
if (preg_match_all('/name[\s]*=[\s]*"([^"]+)"/', $formtexte, $inpmatches, PREG_SET_ORDER)) {
foreach($inpmatches as $inpmatch) {
$champ = $formdesc->ajouter_champ($inpmatch[1]);
$avec_file |= $champ->type == DescripteurChamp::TYPE_FILE;
$formtexte = str_replace($inpmatch[0], 'name="'.$champ->formvar.'"', $formtexte);
}
}
// Traitement des paramètres, si présents
if (isset($_REQUEST['form_sid']) && $_REQUEST['form_sid'] == $sid) {
$formdesc->controle_params();
if (! $formdesc->champ_erreur->erreur) {
$this->traiter_formulaire($formdesc);
if ($formdesc->urlsucces != '') {
redirige($formdesc->urlsucces);
}
}
}
//$texte = '<form name="'.$nom.'"'; // action="'.htmlentities(url_page_courante()).'"';
$texte = '<form name="'.$nom.'" action="'.$url.'"';
// Ajouter tous les attributs qu'on ne connait pas.
if (preg_match_all("/([a-zA-Z]+)=\"[^\"]+\"/", $args, $tagmatches, PREG_SET_ORDER)) {
foreach($tagmatches as $tagmatch) {
if (! in_array($tagmatch[1], $formtags)) $texte .= ' '.$tagmatch[0];
}
}
// Upload -> multipart/form-data !
if ($avec_file != '') $texte .= ' enctype="multipart/form-data"';
$texte .= ">\n";
$texte .= '<input type="hidden" name="form_sid" value="'.$sid.'" />'."\n";
$texte .= '<input type="hidden" name="action" value="formesmagiques" />'."\n";
$texte .= $formdesc->substitutions($formtexte);
$texte .= '</form>'."\n";
$res = str_replace($match[0], $texte, $res);
}
}
}
}
?>
NB : remplacer les realpath(dirname(__FILE__)) par __DIR__ si php > 5.3