Initial commit

This commit is contained in:
2020-01-27 08:56:08 +01:00
commit b7525048d6
27129 changed files with 3409855 additions and 0 deletions

View File

@@ -0,0 +1,392 @@
<?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');*/
var $id;
var $nom;
var $prenom;
var $email;
var $tel;
var $sujet;
var $message;
var $adresse;
var $cpostal;
var $ville;
var $date;
var $lu;
public $erreur = false;
var $table = "contact";
var $bddvars = array("id","nom","prenom","email","tel","sujet","message", "adresse", "cpostal", "ville", "date","lu");
private $upload_dir;
public function __construct()
{
parent::__construct(self::MODULE);
$this->upload_dir = realpath(dirname(__FILE__)) . '/upload';
}
function Formesmagiques(){
$this->PluginsClassiques();
}
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();
$variable = new Variable();
if(!$variable->charger("contact")){
$emailcontact = new variable();
$emailcontact->charger("emailcontact");
$variable->nom = "contact";
$variable->valeur = $emailcontact->valeur;
$variable->add();
}
$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>
Envoyé depuis le site.
";
$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>Envoyé depuis le site.</p>
";
$messagedesc->add();
}
$query = "CREATE TABLE `contact` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nom` VARCHAR( 255 ) NOT NULL ,
`prenom` VARCHAR( 255 ) NOT NULL ,
`email` VARCHAR( 255 ) NOT NULL ,
`tel` VARCHAR( 30 ) NOT NULL ,
`sujet` VARCHAR( 255 ) NOT NULL ,
`message` TEXT NOT NULL ,
`adresse` VARCHAR( 255 ) NOT NULL ,
`cpostal` VARCHAR( 255 ) NOT NULL ,
`ville` VARCHAR( 255 ) NOT NULL ,
`date` DATETIME NOT NULL ,
`lu` INT NOT NULL
)";
$this->query($query);
}
function charger($id){
return $this->getVars("select * from $this->table where id=\"$id\"");
}
function destroy()
{
// $this->query("DROP TABLE `".self::TABLE."`");
}
function action(){
global $action;
switch($action){
case "contact":
$this->crea_contact();
break;
}
}
function demarrage(){
if(!isset($_SESSION["contact"])){
$_SESSION["contact"] = new Contact();
}
}
function crea_contact(){
$urlsite = new Variable("urlsite");
$contact = new Contact();
$contact->nom = strip_tags($_POST["nom"]);
$contact->prenom = strip_tags($_POST["prenom"]);
if( preg_match("/^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]{2,}[.][a-zA-Z.]+$/",$_POST["email"])) $contact->email = strip_tags($_POST["email"]);
$contact->tel = strip_tags($_POST["tel"]);
$contact->sujet = strip_tags($_POST["sujet"]);
$contact->message = strip_tags($_POST["message"]);
$contact->adresse = strip_tags($_POST["adresse"]);
$contact->cpostal = strip_tags($_POST["cpostal"]);
$contact->ville = strip_tags($_POST["ville"]);
$contact->date = date("Y-m-d H:i:s");
$contact->lu = 0;
$contact->add();
}
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');
$traitement = lireTag($args, "traitement"); // BD / EMAIL / THELIA:{connexion|nouveau}
$titre = lireTag($args, "titre");
$urlsucces = lireTag($args, "urlsucces");
// 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("&amp;", "&", $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()).'"';
// 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);
}
}
}
}
?>

Binary file not shown.

View File

@@ -0,0 +1,119 @@
<?php
/* ////////////////////
INITIALISATION
//////////////////// */
/* Démarrage d'une session qui va nous permettre de stocker la valeur à recopier. */
session_start(); // session_start() se place toujours avant toute sortie vers la page web
/* Chemin absolu vers le dossier */
if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/');
/*
Création d'une fonction pour générer la chaîne aléatoire à recopier (sans cryptage) :
- strlen() retourne la taille de la chaine en paramètre
- mt_rand(a, b) génère un nombre aléatoire entre a et b compris : cette fonction est plus rapide que rand() de la bibliothèque standard
- $chars{0} retourne le premier caractère de la chaine $chars, $chars{1} le deuxième ...
*/
function getCode($length) {
$chars = '23456789ABCDEFGHJKLMNPQRSTUVWXYZ'; // Certains caractères ont été enlevés car ils prêrtent à confusion
$rand_str = '';
for ($i=0; $i<$length; $i++) {
$rand_str .= $chars{ mt_rand( 0, strlen($chars)-1 ) };
}
return $rand_str;
}
/* Stockage de la chaine aléatoire de 5 caractères obtenue */
$theCode = getCode(5);
/* Cryptage de la chaine avec md5() avant de la stocker dans la variable de session $_SESSION['formesmagiques_captcha'] de la session en cours.
C'est à cette variable qu'on va comparer le code entré par l'utilsateur dans le formulaire. */
$_SESSION['formesmagiques-captcha'][$_REQUEST['sid']] = md5($theCode);
/* Afin de traiter les caractères séparément, on les stocke un par un dans des variables. */
$char1 = substr($theCode,0,1);
$char2 = substr($theCode,1,1);
$char3 = substr($theCode,2,1);
$char4 = substr($theCode,3,1);
$char5 = substr($theCode,4,1);
/*
glob() retourne un tableau répertoriant les fichiers du dossier 'fonts', ayant l'extension .ttf ou .TTF.
Vous pouvez donc ajouter autant de polices TrueType que vous désirez, en veillant à les renommer.
*/
$fonts = array();
if ($dh = opendir(ABSPATH .'fonts')) {
while ($file = readdir($dh)) {
if ($file == '.' || $file == '..') continue;
$fonts[] = ABSPATH ."fonts/$file";
}
@closedir($dh);
}
else {
die("Ne peut ouvrir le répertoire ".ABSPATH."fonts");
}
/* //////////////////////////////
TRAITEMENT DE L'IMAGE
////////////////////////////// */
/*
imagecreatefrompng() crée une nouvelle image à partir d'un fichier PNG.
Cette nouvelle $image va être ensuite modifiée avant l'affichage.
*/
$image_file = 'images/captcha.png';
$image = imagecreatefrompng($image_file);
if ($image == false) {
die("Ne peut ouvrir l'image $image_file");
}
/*
imagecolorallocate() retourne un identifiant de couleur.
On définit les couleurs RVB qu'on va utiliser pour nos polices et on les stocke dans le tableau $colors[].
Vous pouvez ajouter autant de couleurs que vous voulez.
*/
$colors=array ( imagecolorallocate($image, 0x80,0,0),
imagecolorallocate($image, 0,0x80,0),
imagecolorallocate($image, 0,0,0x80),
imagecolorallocate($image, 0x33,0x33,0x33),
imagecolorallocate($image, 0,0,0) );
/* Création d'une petite fonction qui retourne une VALEUR aléatoire du tableau reçu en paramètre. */
function random($tab) {
return $tab[array_rand($tab)];
}
/*
Mise en forme de chacun des caractères et placement sur l'image.
imagettftext ( resource $image , float $size , float $angle , int $x , int $y , int $color , string $fontfile , string $text )
*/
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 5, 23, random($colors), random($fonts), $char1);
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 18, 23, random($colors), random($fonts), $char2);
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 37, 23, random($colors), random($fonts), $char3);
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 62, 23, random($colors), random($fonts), $char4);
imagettftext($image, mt_rand(14,18), mt_rand(-20, 20), 80, 23, random($colors), random($fonts), $char5);
/* //////////////////////////////
FIN => ENVOI DE L'IMAGE
////////////////////////////// */
/*
Comme c'est le fichier image.php et non captcha.png qui va être appelé,
on envoie un en-tête HTTP au navigateur via header() pour lui indiquer
que image.php est bien une image au format PNG.
*/
header('Content-Type: image/png');
/* .. et on envoie notre image PNG au navigateur. */
imagepng($image);
/* L'image ayant été envoyée, on libère toute la mémoire qui lui est associée via imagedestroy(). */
imagedestroy($image);
?>

View File

@@ -0,0 +1,216 @@
<?php
class DescripteurChamp {
const ACTION_OBLIGATOIRE = 'o';
const ACTION_FACULTATIF = 'f';
const ACTION_IGNORER = 'i';
const TYPE_STRING = 'string';
const TYPE_INT = 'int';
const TYPE_FLOAT = 'float';
const TYPE_EMAIL = 'email';
const TYPE_FILE = 'file';
const TYPE_CAPTCHA = 'captcha';
const CAPTCHA_URL_FORMAT = '%s/client/plugins/formesmagiques/captcha.php?sid=%s';
public $formvar;
public $var;
public $type;
public $action;
public $label;
public $tableau = false;
public $erreur = false;
public $valeur = "";
public function __construct($textdesc = false) {
if ($textdesc) {
$data = explode('|', $textdesc);
$formvar = $data[0];
$var = "#" . strtoupper($formvar);
if (isset($data[1])) {
switch($data[1]) {
case 'o' :
$action = self::ACTION_OBLIGATOIRE;
break;
case 'f' :
$action = self::ACTION_FACULTATIF;
break;
case 'i' :
$action = self::ACTION_IGNORER;
break;
case '' :
$action = self::ACTION_FACULTATIF;
break;
default :
die("Formesmagiques Action '".$data[1]."' sur le champ '$formvar' invalide. Valeurs valides: o, f, i");
}
}
$type = self::TYPE_STRING;
if (isset($data[2])) {
switch($data[2]) {
case 'chaine' :
$type = self::TYPE_STRING;
break;
case 'entier' :
$type = self::TYPE_INT;
break;
case 'reel' :
$type = self::TYPE_FLOAT;
break;
case 'email' :
$type = self::TYPE_EMAIL;
break;
case 'fichier' :
$type = self::TYPE_FILE;
break;
case 'captcha' :
$type = self::TYPE_CAPTCHA;
break;
case '' :
$type = self::TYPE_STRING;
break;
default :
die("Formesmagiques Type '".$data[2]."' sur le champ '$formvar' invalide. Valeurs valides: chaine, entier, reel, email, fichier, captcha");
}
}
$label = isset($data[3]) ? $data[3] : ucfirst($formvar);
$valeur = isset($data[4]) ? $data[4] : '';
$this->creer($formvar, $var, $type, $action, false, $label, $valeur);
}
}
public function creer($formvar, $var, $type, $action, $tableau, $label, $valeur)
{
$this->formvar = $formvar;
$this->var =$var;
$this->type =$type;
$this->action = $action;
$this->tableau = $tableau;
$this->label = $label;
$this->valeur = $valeur;
}
public function copie($champ)
{
$this->formvar = $champ->formvar;
$this->var =$champ->var;
$this->type =$champ->type;
$this->action = $champ->action;
$this->tableau = $champ->tableau;
$this->label = $champ->label;
$this->valeur = $champ->valeur;
}
public function controler($text) {
if ($this->action == self::ACTION_OBLIGATOIRE) {
switch($this->type) {
case DescripteurChamp::TYPE_STRING:
$text = filter_var($text, FILTER_SANITIZE_STRING);
if ($text == '') $text = false;
break;
case DescripteurChamp::TYPE_INT:
$text = filter_var($text, FILTER_VALIDATE_INT);
break;
case DescripteurChamp::TYPE_FLOAT:
$text = filter_var($text, FILTER_VALIDATE_FLOAT);
break;
case DescripteurChamp::TYPE_EMAIL:
$text = filter_var($text, FILTER_VALIDATE_EMAIL);
break;
case DescripteurChamp::TYPE_CAPTCHA:
$text = filter_var($text, FILTER_SANITIZE_STRING);
// Vérifier que le captcha est correct
if (md5(strtoupper(trim($text))) != $_SESSION['formesmagiques-captcha'][$this->formvar]) $text = false;
break;
}
if ($text === false) $this->erreur = true;
}
$text = trim($text);
$valeur = get_magic_quotes_gpc() ? stripslashes($text) : $text;
if ($this->tableau) {
$this->valeur[] = $valeur;
}
else {
$this->valeur = $valeur;
}
}
public function substitution($texte) {
// Pour un champ de type captcha
if ($this->type == self::TYPE_CAPTCHA) {
// Les URLs du captcha, sous forme de substitution simple.
$url = sprintf(self::CAPTCHA_URL_FORMAT, Variable::lire('urlsite'), $this->formvar);
$texte = str_replace($this->var.'_URL_IMAGE', $url, $texte);
$texte = str_replace($this->var.'_URL_CHANGER_IMAGE', $url.'&id='.rand(1,1000), $texte);
}
// Forme #varname[texte...]
$texte = preg_replace("/\\".$this->var."\[([^]]*)\]/", $this->erreur ? "\\1" : '', $texte);
if ($this->tableau) {
// Forme #varname(@), pour retrouver le nombre d'élements dans une variable de type tableau
$texte = str_replace("$this->var(@)", is_array($this->valeur) ? count($this->valeur) : '0', $texte);
// Forme #varname(index), pour les variables de type tableau)
if (preg_match_all("/\\$this->var\(([0-9]+)\)/", $texte, $matches, PREG_SET_ORDER)) {
foreach($matches as $match) {
$idx = intval($match[1]) - 1;
$val = isset($this->valeur[$idx]) ? $this->valeur[$idx] : '';
$texte = str_replace($match[0], $val, $texte);
}
}
// Supprimer tous les #varname(n) qui n'ont pas été évalués précédemment.
$texte = preg_replace("/$this->var\([0-9]+\)/", '', $texte, -1, $count);
}
else {
// Forme #varname, pour par exemple #FILTRE_egalite(#varname||1||...)
$texte = str_replace($this->var, $this->valeur, $texte);
}
return $texte;
}
}
?>

View File

@@ -0,0 +1,183 @@
<?php
include_once(realpath(dirname(__FILE__)) . "/DescripteurChamp.class.php");
class DescripteurForm {
public $nom;
public $action;
public $sid = "";
public $urlsucces = "";
public $champ_erreur = false;
public $champs = array();
private $upload_dir;
public function __construct() {
$this->champ_erreur = new DescripteurChamp();
$this->champ_erreur->creer(
"__inutilise__",
"#ERREUR_SAISIE",
DescripteurChamp::TYPE_STRING,
DescripteurChamp::ACTION_FACULTATIF,
false,
"Erreur generale forme",
false
);
$this->upload_dir = __DIR__ .'/../upload';
$this->upload_url = urlfond() . '/client/plugins/formesmagiques/upload';
}
public function ajouter_champ($nom) {
$champ = new DescripteurChamp($nom);
$this->champs[$champ->formvar] = $champ;
return $champ;
}
public static function tri_par_longueur($a, $b) {
return (strlen($b->var) - strlen($a->var));
}
public function substitutions($texte) {
$texte = $this->champ_erreur->substitution($texte);
// Trier les variables par ordre décroissant de longueur
// pour éviter les écrasements du genre #NOM / #NOMBRE
$tmptab = $this->champs;
usort($tmptab, array($this, 'tri_par_longueur'));
foreach($tmptab as $champ) {
$texte = $champ->substitution($texte);
}
return $texte;
}
protected function substitutions_mail($texte) {
foreach($this->champs as $champ) {
$texte = str_replace("__".strtoupper($champ->nom)."__", $champ->valeur);
}
return $texte;
}
/*
* Traitement des paramètres saisis dans la form
*/
public function controle_params() {
$this->champ_erreur->erreur = false;
foreach($this->champs as &$champ) {
$champ->erreur = false;
$champ->valeur = '';
if ($champ->type != DescripteurChamp::TYPE_FILE) {
if (isset($_REQUEST[$champ->formvar])) {
$val = '';
if ($champ->tableau) {
$champ->valeur = array();
if (is_array($_REQUEST[$champ->formvar])) {
foreach($_REQUEST[$champ->formvar] as $valeur) {
$champ->controler($valeur);
}
}
else {
$champ->controler($_REQUEST[$champ->formvar]);
}
}
else {
$champ->controler($_REQUEST[$champ->formvar]);
}
}
}
else if (isset($_FILES[$champ->formvar])) {
$file = &$_FILES[$champ->formvar];
if ($champ->tableau) {
$champ->valeur = array();
$count = count($file['name']);
for ($idx = 0; $idx < $count; $idx++) {
if ($file['error'][$idx] != UPLOAD_ERR_NO_FILE) {
$ret = $this->upload_fichier(
$file['error'][$idx],
$file['name'][$idx],
$file['tmp_name'][$idx]
);
if ($ret !== false)
$champ->valeur[] = $ret;
else
$champ->erreur = true;
}
}
} else if ($file['error'] != UPLOAD_ERR_NO_FILE) {
$ret = $this->upload_fichier($file['error'], $file['name'], $file['tmp_name']);
if ($ret !== false)
$champ->valeur = $ret;
else
$champ->erreur = true;
}
}
if ($champ->action == DescripteurChamp::ACTION_OBLIGATOIRE && empty($champ->valeur)) {
$champ->erreur = true;
$this->champ_erreur->erreur = true;
}
}
}
protected function upload_fichier($err, $name, $tmp_name) {
if ($err == UPLOAD_ERR_OK) {
$filename = preg_replace('/[^A-Za-z0-9-_\.]/', '_', $name);
$idx = 1;
$prefix = '';
while (file_exists($this->upload_dir.'/'.$prefix.$filename)) {
$prefix = $idx . '_';
$idx++;
}
$localfile = $this->upload_dir . '/' . $prefix.$filename;
if (move_uploaded_file($tmp_name, $localfile)) {
return $this->upload_url . "/" . basename($localfile);
}
}
return false;
}
}
?>

View File

@@ -0,0 +1,34 @@
<?php
include_once(realpath(dirname(__FILE__)) . "/../../../../classes/Baseobj.class.php");
class Formulaire extends Baseobj {
var $id;
var $nom;
const TABLE = 'fm_formulaire';
var $table = self::TABLE;
var $bddvars = array('id', 'nom');
public function __construct($nom = false) {
parent::__construct();
if ($nom) $this->charger($nom);
}
public function init() {
$query = "
CREATE TABLE IF NOT EXISTS `".self::TABLE."` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nom` TEXT NOT NULL
)";
$this->query($query);
}
public function charger($nom) {
return $this->getVars("select * from $this->table where nom='".mysql_real_escape_string($nom)."'");
}
}
?>

View File

@@ -0,0 +1,41 @@
<?php
include_once(realpath(dirname(__FILE__)) . "/../../../../classes/Baseobj.class.php");
class FormulaireChamp extends Baseobj {
var $id;
var $instance;
var $nom;
var $label;
var $valeur;
const TABLE = 'fm_formulaire_champ';
var $table = self::TABLE;
var $bddvars = array('id', 'instance', 'nom', 'label', 'valeur');
public function __construct($id = false) {
parent::__construct();
if ($id) $this->charger($id);
}
public function init() {
$query = "
CREATE TABLE IF NOT EXISTS `".self::TABLE."` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`instance` INT(11) NOT NULL,
`nom` TEXT NOT NULL,
`label` TEXT NOT NULL,
`valeur` TEXT
)";
$this->query($query);
}
public function charger($id) {
$this->id = $id;
return parent::charger();
}
}
?>

View File

@@ -0,0 +1,41 @@
<?php
include_once(realpath(dirname(__FILE__)) . "/../../../../classes/Baseobj.class.php");
class FormulaireInstance extends Baseobj {
var $id;
var $formulaire;
var $date;
var $ip;
var $lu;
const TABLE = 'fm_formulaire_instance';
var $table = self::TABLE;
var $bddvars = array('id', 'formulaire', 'date', 'ip', 'lu');
public function __construct($id = false) {
parent::__construct();
if ($id) $this->charger($id);
}
public function init() {
$query = "
CREATE TABLE IF NOT EXISTS `".self::TABLE."` (
`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`formulaire` INT(11) NOT NULL,
`date` INT(11) NOT NULL,
`ip` text NOT NULL,
`lu` INT(1) DEFAULT 0
)";
$this->query($query);
}
public function charger($id) {
$this->id = $id;
return parent::charger();
}
}
?>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -0,0 +1,3 @@
<?php
include_once(realpath(dirname(__FILE__)) . "/classes/DescripteurForme.class.php");
?>

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--Migration automatique depuis le fichier original, sauvegardé dans plugin.xml.save-->
<plugin>
<descriptif lang="fr">
<titre>Formulaires Magiques</titre>
<chapo></chapo>
<description>Ce plugin permet de créer très simplement en front-office des formulaires protégés par un captcha, et supportant l'upload de fichiers.</description>
<postscriptum></postscriptum>
</descriptif>
<version>0.6.2</version>
<auteur>
<nom>Franck Allimant - thelia@allimant.org</nom>
<societe></societe>
<email></email>
<web></web>
</auteur>
<type>classique</type>
<prerequis/>
<thelia>1.5.0</thelia>
<etat>production</etat>
<documentation>LISEZMOI.pdf</documentation>
<urlmiseajour></urlmiseajour>
</plugin>

View File

@@ -0,0 +1,75 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
#INCLURE "template/meta.html"
</head>
<body>
<div id="wrapper">
<div id="subwrapper">
#INCLURE "template/entete.html"
<div id="chemin">::navigation:: :<a href="#URLSOMMAIRE">::accueil::</a> / Contact</div>
#INCLURE "template/menu.html"
<div id="contenu">
<TEST_form_ok variable="#ENV{contactok,0}" test="egal" valeur="1">
<p>Merci !</p>
<p>Votre message à é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)" method="post" class="formulaire" id="contact">
#ERREUR_SAISIE[<div class="form-erreur message-erreur">Merci d'indiquer les informations indispensables</div>]
<div class="formline">
<label class="#NOM[erreur]" for="nom">Votre Nom</label>
<input #NOM[class="erreur"] type="text" name="nom|f" id="nom" value="#NOM" />
</div>
<div class="formline">
<label class="#EMAIL[erreur]" class="obligatoire" for="email">Votre adresse E-mail [*]</label>
<input #EMAIL[class="erreur"] type="text" name="email|o|email|Adresse e-mail" id="email" value="#EMAIL" />
</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 for="message">Fichier</label>
<input type="file" name="fic|f|fichier|Fichier joint" />
</div>
<div class="formline">
<label class="#MESSAGE[erreur]" for="message">Votre message [*]</label>
<textarea #MESSAGE[class="erreur"] rows="4" cols="50" name="message|o||Message" id="message">#MESSAGE</textarea>
</div>
<div class="formline">
<label for="code">Veuillez saisir le code ci-contre pour valider votre message </label>
<img src="#CODE_URL_IMAGE" alt="Captcha" id="captcha" />
<!-- Changer d'image à la volée si elle est illisible -->
<a style="cursor:pointer" onclick="document.images.captcha.src='#CODE_URL_CHANGER_IMAGE'">Changer ce code</a>
<input type="text" id="code" class="#CODE[form-erreur]" name="code|o|captcha" />
</div>
<div class="formline">
<label class="infos-obligatoire">[*] Informations indispensables</label>
<button type="submit">Envoyer</button>
</div>
</FORMULAIRE_contact>
<//TEST_form_ok>
</div>
#INCLURE "template/pied.html"
#INCLURE "template/signature.html"
</div>
</div>
</body>
</html>