Alternative au captcha
Avant-propos : Suite à quelques messages sur le forum concernant des problèmes liés aux captchas, je propose une petite alternative (déjà existante) à ceux-ci. L’alternative que nous allons voir est dans le cadre d’un formulaire de contact (applicable au livre d’or également). Il s’agit de la confirmation par email avant l’envoie définitive du message dans notre boîte mail; un peu comme pour confirmer un mot de passe.
Alors, pour changer nous allons faire de l’objet avec du MVC, parce qu’il y a un peu marre de voir/faire QUE du procédural avec des codes mélangés partout dans les applications comme ceux qui traînent sur le forum notamment. Attention ! Je n’explique pas l’objet, ce n’est pas le but ici. D’ailleurs je n’explique pas grand-chose, partant du principe que le tout à été très simplifié pour un résultat optimum. La compréhension n’est donc pas difficile.
Niveau requis : Novice et initié
Pré-requis : il faut avoir une base d’objet et de MVC embarquée dans le cerveau.
Avantages :
- Pas de codes illisibles à taper (même pour ceux qui voient correctement)
- L’envoie doit être confirmer.
- On pourrait blacklisté les adresses emails indésirables au lieu des ips.
Inconvénients :
- L’internaute doit « sortir » de la page, et effectuer des opérations supplémentaires (ouvrir sa boîte mail, confirmer l’envoi)
Notre site
On supposera notre site web sous l’intituler ‘MonSite.com’
On bossera dans 1,2,3…6 dossiers, qui sont :
- http://www.MonSite.com/classes/
- http://www.MonSite.com/config/
- http://www.MonSite.com/controllers/
- http://www.MonSite.com/mails/
- http://www.MonSite.com/themes/
- http://www.MonSite.com/tools/phpmailer/
Dossier tools/
Ce dossier contiendra la classe phpmailer. Cette classe permet d’envoyer des emails en toutes simplicités. On se servira donc d’une solution existante et performante. Je ne m’attarderais pas sur la façon de l’utiliser ! De toute façon vous le verrez (de visu) par vous-même au cours de ce tuto.
Dossier config/
On va crée un fichier, qu’on nommera : config.inc.php
Ce fichier est la pièce maîtresse de notre site c’est dedans qu’on initialisera notre site

La fonction __autoload() s’occupera de charger nos classes automatiquement.
Le reste c’est du classique.
Dossier mails/
Dans ce dossier nous allons y placés tous les ‘gabarits’ pour nos emails.
Pour les besoins de notre tuto il va en falloir 2 :
Fichier valid_contact.txt

Ce fichier est celui qui envoie un lien de confirmation, pour vérifier que c’est bien un humain qui a pris contact avec nous.
Fichier send_contact.txt

Ce fichier contiendra le message que l’internaute a voulu nous envoyer. En gros c’est l’email envoyé par l’internaute.
Dossier themes/
Fichier contact.tpl
Il s’agit tout simplement du formulaire de contact

Dossier classes/
Le nom de nos classes porte le nom de nos fichiers. Donc quand je ferais référence à la classe ‘Kapout’, le nom du fichier est également Kapout ; ceci fait parti intégrante du chargement automatique des classes par __autoload().
Classe Database
Elle contient les méthodes qui permettent d’effectuer la connexion avec la base de données ainsi que l’exécution des requêtes.

- Méthode instance() : Effectue la connexion avec la base de donnée et affiche un message d’erreur en cas d’impossibilité.
- Méthode query() : Prend 3 arguments dont 2 facultatifs ; $query est la requete SQL avec marqueur ‘ ?’, $args est la/les valeur(s) de remplacements des marqueurs, $mode désigne si on veut récupérer toutes lignes ou une seule du jeu de résultats. Uniquement utilisé pour les SELECT
- Méthode exec() : Prend 2 arguments dont 1 facultatif. Les mêmes que pour la méthode query(). Utilisés pour les autres types de requêtes.
Classe Mail
Gère l’envoie des emails à l’aide de la classe phpmailer, et les gabarits d’emails.

Prend 5 arguments dont 1 faculatif :
- $to = destinataire du mail
- $from = expéditeur
- $fromName = nom de l’expéditeur
- $subject = sujet du mail
- $mailName = nom de l’email-template à charger
- $mailVars = valeurs à remplacer dans le template {X}
- $toName = nom du destinataire
Classe Template
Ce n’est pas du lourd comme moteur de template ! Mais il fera ce qu’on lui dit pour les besoins du tuto.
P.S : il ne gère pas les boucles…j’ai prévenu !!

setBundle() prend 2 arguments dont 1 facultatif :
- $file = noms des templates à charger « array(‘head.tpl’, ‘foot.tpl’) ; »
- $vars = valeurs à remplacer dans le template {X}
getContentFile() prend un argument, le fichier à charger
Classe Contact

Enregistre dans la base de données le message que l’internaute tente de nous envoyer.

Confirme qu’il s’agit bien d’un humain à l’aide de l’id de confirmation contenu dans le lien de confirmation fournit en url.

cleannerMessage() effectue le nettoyage de la base pour les messages vieux de plus de 2 jours ou supprime un message précédemment confirmer.
returnkey() renvoie un code id pour la confirmation
Dossier controllers/
Fichier contact.php
Ce fichier effectue les opérations de contrôlent, pour la validation et l’envoie du formulaire ainsi que la confirmation du message par l’id.
Ce fichier utilise une classe de gestion pour formulaire nommée « Form », que j’ai développé auparavant et qui est disponible sur ‘phpcs’


Et pour finir…Dossier racine/
Fichier contact.php

C’est le fichier qui sera appelé par l’internaute : http://www.MonSite.com/contact.php.
C’est lui qui imbriquera les fichiers pour la page contact.php
Screenshots
Page contact.php initialisée

Aucuns champs remplies

Champs invalides

Envoie du mail de confirmation

Tentative de confirmation un id erroné

Id validé

Mot de la fin
Quand on regarde le tout on se dit c’est beaucoup de lignes pour une seule petite chose : OUI !
On aurait pu faire le tout avec moins de lignes de codes, moins de dossiers, moins de fichiers. Mais quand on fait de l’objet (du bon !) avec du MVC ce n’est pas possible de faire petit. Mais on y gagne en lisibilité !! L’application est propre et on sait qui fait quoi.
Je tiens à préciser que chaque ligne de codes a été spécifiquement crée pour ce tuto, donc certaines choses ne sont pas forcément réutilisable pour d’autre cas de figure. Alors ce n’est même pas la peine de me dire « ben j’ai fait ci, j’ai fait ça et ça marche pas quand je veux… » Je ne répondrai pas !
Outils externes utilisés dans le tuto
Lien pour la télécharger la classe PhpMailer: http://phpmailer.worxware.com/
Lien pour la télécharger ma classe Form :
http://www.phpcs.com/codes/CLASSES-VALIDATION-FORMULAIRE_52367.aspx
Autres informations :
- Y a-t-il une page de teste ? Non et il n’y en aura pas ! L’appli a été testé par mes soins tout est ok donc fonctionnel et puis je n’en ai pas envie !
- Je le redis : « Aucune demande d’aide ne sera traitée ici, il y a le forum pour ça ! »