Saisie des commentaires en Flash
Par -Alexandre LEGOUT aka LAlex- le vendredi, janvier 23 2004, 16:29 - AS2 - Lien permanent
Comme suggéré dans le blog de Stéfane Funaro, créer un formulaire de saisie en Flash pour les commentaires d'un blog permet de se mettre à l'abris de manière quasi-complète des "blogspams" ... J'ai mis en place ici ce type d'outil.
Pour ceux qui avaient choisis de garder un cookie du blog pour mémoriser leurs noms, email, et site web, vous pouvez l'effacer, étant donné que c'est un ShardeObject qui est maintenant utilisé ! ![]()
En ce qui me concerne, ayant un blog "fait maison", je n'ai pas encore eu à faire face a des spammeurs, mais c'est surtout pour des raisons pratiques de formatage du texte par les BBCode que j'ai fait ce formulaire en Flash. Je n'ai pas pris la peine de faire un preload pour les 2,26Ko occupés par l'animation ... 8|
Le problème qui s'est posé à moi est que la classe Selection est assez capricieuse : en effet, elle ne permet de connaitre la zone sélectionnée que pour un élément ayant le focus. Or, lorsque l'on clique sur un bouton, ce bouton prend le focus, et on perd donc les informations concernant le texte qui est selectionné. J'ai donc créé une mini-classe qui permet de garder en permanence la sélection faite sur une zone de texte donnée, et de lui appliquyer des "tags" : dans le cas de ce blog, ces tags sont bien évidemment des BBCodes ... ![]()
Je vous la livre telle quelle, vite faite et vite commentée ! :oops:/**
* TextFormater
* Premier brouillon, v0.0 alpha
*
* Surveille la sélection dans un champ texte
* et fournit les outils pour le formater
*/
class TextFormater {
// TextField à formater
private var _textfield:TextField;
// Position de début et de fin de la sélection
private var _begin:Number;
private var _end:Number;
// Constructeur
// Prend en paramètre le champ texte à formater
function TextFormater ($tf:TextField) {
this._textfield = $tf;
// On crée une propriété dans le TextField
// qui pointe vers l'objet TextFormater
this._textfield._formater = this;
// Quand le champ texte prend le focus
// on surveille la selection
this._textfield.onSetFocus = function() {
this._formatInterval = setInterval(this._formater,"checkSelection",50);
}
// Quand le champ texte perd le focus
// on arrête de le surveiller
this._textfield.onKillFocus = function() {
clearInterval(this._formatInterval);
}
}
// Surveille la sélection faite dans le champ texte
function checkSelection() {
// Si le champ texte a bien le focus
if (eval(Selection.getFocus()) == this._textfield) {
// On renseigne le début et la fin de la selection
this._begin = Selection.getBeginIndex();
this._end = Selection.getEndIndex();
}
}
// Ajoute un "tag" (BBCode ou autre) au début
// et à la fin de la sélection
function addTag($begin:String, $end:String) {
var txt:String = this._textfield.text;
// Encadre la sélection avec les tags
this._textfield.text = txt.slice(0,this._begin) + $begin + txt.slice(this._begin,this._end) + $end + txt.slice(this._end);
// Donne le focus au champ texte et sélectionne
// le texte encadré par les tags
Selection.setFocus(this._textfield);
Selection.setSelection(this._begin,this._end + $begin.length + $end.length);
}
}
J'espère que ce formulaire vous rendra la vie plus facile pour égayer vos commentaires, en attendant la version W3C du blog, et les versions Flash du blog et de mon site perso. ^^
Commentaires
Je serai le premier à utiliser ce formulaire !!!
Hello



Vraiment du bon boulot.. comme d'hab
Pour ma part je me suis lancé sur un blog 100% flash ... donc cela va me servir ton code au dessus
merci
lol tu m'as eu de peu ... ^^
C'est mignon
Pour gérer les sélections dans Flash, on peut aussi surveiller les évènements mouseUp et keyUp au lieu de faire un setInterval. Ca fait moins de "checkSelection"...
Cela dit, on peut toujours envoyer directement des commentaires par ton script d'insertion
Mais peut-être que les blogspams ne savent que lire le html.
L'autre avantage de Flash, c'est que le formulaire se souvient de moi même si je vide les cookies html ! :))
tu as raison pour les mouseUp, keyUp, mais si je clique en dehors de l'anim, va-t-il intercepter ces évènements ? :o Je vais essayer de ce pas ...
il faut encore savoir quels sont les variables envoyer, et le nom de la page qui insère. Alors a moins de choper le swf, le décompiler pour savoir quelles sont les noms de variables, et utiliser le script ensuite ... 8| Mais il faut vraiment être motivé ou m'en vouloir à mort !!!
++ ^^
L'intérêt c'est que ces évènements auront lieu quand on édite le texte, donc quand c'est utile !
Hin hin, je peux aussi spammer tes commentaires avec toutes ces infos (car évidemment je me suis amusé à décompiler ton swf)
Le problème est de savoir si je commence à sélectionner un texte, que je glisse ma souris jusque sur le côté (en dehors du SWF), et que je relâche la souris, est-ce qu'il va bien me stocker la séection ? :o L'évenement onKeyUp est moins génant, et en plus pas besoin de vérifier le focus, il ne se déclenche que quand le clip (ou TextField) à le focus !
Quoi ?!? 8O Vandale va !!!
Ben oui, se mettre complètement à l'abris du spam, c'est pas évident ... :? disons que les processus automatisés auront plus de mal ...
C'est-b un truc-i magnifique-u

LAlex-AS(test) class TextFormater {
// TextField à formater
-----------------
cool! I made a post in my blog
Wow! Bon, tu m'as devancé!!
Moi j'ai commencé en m'inspirant de la classe TextFlair de Samuel Wan dans son livre OOP with ActionScript, chapitre 13. Le code source est disponible sur le site aussi (il semble down aujourd'hui...).
Je continue le mien!
test ...(sorry pour des question de dev je ne peux pas installer le player v7 sur ma becane)
comme quoi un inconvénient avec un peu de pragamtisme peut se transformer en avantage
humm et si on y pense ca peut s'adapter a autre chose que e post de comments dans des blogs hehe
Juste pour le test.. depuis linux
chuss
Re,
fallait se douter que ça passait pas nickel avec la derniere version 6.0.79 du player linux..
Le SO local passe pas non plus..
mais bon.. je dois pas avoir la config de la majorité ..
++
salut
un peu en retard sur le sujet, mais je viens de me rendre compte que la class Selection a les propriétés lastBeginIndex et lastEndIndex qui ne figure même pas dans la classe intrinsic... :\ .
Ça permet de récuperer la sélection via l'événement onSetFocus.
++
liguo > Interessant !
Mais comment tu t'en es rendu compte ? Et si les propriétés ne sont pas déclarées dans la classe intrinsic, ca ne risque pas de provoquer une erreur ? :o
je m'en suis rendu compte car j'avais le même problème avec la classe Selection et j'ai été voir comment MM ont procédé dans leurs components. C'est dans le classe mx.controls.TextArea ligne 580 que j'ai trouvé la vérité ;). En effet les codeurs de MM trompe le compilateur en procédant de la façon suivante :
voila de quoi a l'air ta classe avec un listener au lieu du setInterval()
var currentSelection:Object = Selection;pour ce qui est de la classe intrinsic, pour éviter les messages d'erreurs, il suffit de faire un des nombreux trucs pour tromper le compilateurSelection.setSelection(currentSelection.lastBeginIndex, currentSelection.lastEndIndex);
class TextFormater{private var _field:TextField;
private var _start:Number;
private var _end:Number;
public function TextFormater(field:TextField){
_field = field;
Selection.addListener(this);
}
public function onSetFocus(evt:Object):Void{
_start = Selection["lastBeginIndex"];
_end = Selection["lastEndIndex"];
}
public function addTag(begin:String, end:String):Void{
var texte = _field.text;
_field.text = texte.substring(0,_start) + begin +_field.text.substring(_start,_end) + end + _field.text.substring(_end);
Selection.setFocus(_field);
Selection.setSelection(_start,_end + begin.length + end.length);
}
}
A++
Salut,
Je reviens sur le problème de sécurité blogspam.
Pourquoi ne pas, au démarage du swf, appeler un script PHP qui génèrerait (et enregistrerait) un code aléatoire. Ce code serait renvoyé avec le formulaire afin que PHP valide l'enregistrement.
Bien sur, chaque code ne pourrait servir qu'une fois. Cela ne serait peut-être pas imparable, mais assez décourageant, non ?
++
non, pas vraiment... l'url du script du script qui génère le token est retraçable assez facilement dans la cache , et ensuite c'est comme s'il n'y en avait pas. Les spammers ne se découragent pas si facilement
Il n'y a pas vraiment de moyen(à ma connaissance) d'empêcher le spam à moins que le script qui insère dans la bd soit sécurisé avec un login/password.
c est cool ce truc
chapeau bas
Fil des commentaires de ce billet