0

Une check-list pour vos landing pages

Posted by admin on mar 12, 2010 in My life

Les landing pages sont de plus en plus utilisées pour optimiser la transformation sur nos applications web. Peut être vous-même dans vos projets vous avez été amenés à en créer ? Ou alors peut être que vous envisagiez cette solution ? Dans les deux situations ce billet peut vous être utile. Comme vous le savez de nombreux experts se sont prononcés sur le sujet. Afin d’avoir une vue d’ensemble des critères impactant favorablement la transformation de vos pages d’atterrissage, j’ai souhaité créer cette check-list. Je vous invite donc à la parcourir et à la compléter par un commentaire.

Les directives à suivre :

  • Devancez les attentes des utilisateurs et apportez leur conseils et soutien dans la prise de décision : Apportez une réponse claire à tout point de vue aux besoins exprimés par votre cible.
  • Gardez bien en tête votre objectif premier : L’utilisateur à exprimé un besoin en cliquant sur votre annonce, orientez le vers sa solution et ne proposez rien à l’écran de l’utilisateur qui puisse le dérouter vers un nouvel objectif.
  • La confiance est synonyme de résultats alors tenez vos promesses.

Les étapes essentielles avant de partir dans la conception :

  • Analysez les comportements de l’utilisateur et pensez à respecter les standards d’usage.
  • Etudiez la concurrence : analysez le design et les flux de navigation.

Définissez une stratégie pour vos landing pages :

  • Segmentez votre catalogue produits pour vos campagnes : Tout élément cité (marques, produits, services, etc.) dans vos annonces peu importe le support (moteurs, supports e-publicité, programme d’affiliation, etc.) doivent être présents sur votre landing page. Ce sont des points de confiance à gagner ou à perdre si vous ne suivez pas ce conseil.
  • Créez des pages dédiées à vos produits les plus populaires : Il apparait nécessaire d’apporter un soin particulier aux produits les plus recherchés. Les pages dédiées prendront en compte les attentes spécifiques liées à ces produits.

Les contenus : Un outil au service de la transformation

\\ Pensez vos contenus :

  • Créez de la proximité : Adressez vous à l’utilisateur en utilisant le vous, le vôtre, etc.
  • Veillez à ce que la réponse au besoin exprimé par le clic de l’utilisateur (call to action) soit présente dans votre titre de page.
  • Vendez votre campagne dès les premières phrases : Cela passe à travers le titre et l’accroche (Un paragraphe de 15 à 30 mots incitatifs).
  • Renforcez votre crédibilité : Mettez en avant des témoignages, des parutions presse, vos partenaires, le service client. Toutes ces élément impacts positivement la confiance et la respectabilité.
  • Permettez leur de comparer : Les acheteurs recherchent du prix alors proposez leur un comparatif entre différents fournisseurs.
  • Faites preuve de transparence : Tenez vous aux faits, énoncez les caractéristiques et fonctionnalités de vos produits.
  • Apportez des justifications : Pourquoi acheter tel produit plutôt qu’un autre ? Des réponses concrètes aux questions que peuvent se poser les utilisateurs et qui pourraient se révéler être des freins à l’action si vous ne faites pas en sorte de les désamorcer tout de suite.

\\ Facilitez la lecture et mettez en avant vos avantages :

  • Des listes à puces pour énoncer les bénéfices produits : Gardez à l’esprit que vos utilisateurs doivent assimiler un maximum de contenus en quelques secondes.
  • Utilisez des caractères gras pour renforcer les messages clés.
  • Les paragraphes ne doivent pas dépasser trois lignes : Une idée par paragraphe. Le volume d’informations est fonction de la complexité du produit ou du service proposé.

\\ Les erreurs à éviter :

  • Faites attention à l’orthographe et à la grammaire : elles impactent directement la confiance et la respectabilité de votre site.
  • Veillez à ne pas trop offrir de portes de sorties : insérer un lien vers une source extérieure uniquement si cela apparait utile et nécessaire.

Les contenus ne sont pas vos seules armes pour développer votre taux de conversion :

  • Créez des pages sobres et claires : faites attention au choix des couleurs, privilégiez des contrastes importants.
  • Pensez l’organisation des éléments sur la page : Veillez à mettre les éléments importants ou critiques au dessus du pli de la page.
  • Illustrez vos propos par des visuels : les visuels sont une occasion d’impacter positivement l’intention d’achat.
  • Optimisez la lisibilité des contenus : Choisir une taille et une police de caractères adaptées.
  • Un appel clair à l’action : Faites ressortir des boutons de couleurs contrastées par rapport à votre fond, préféré les fonds blancs et apportez une grande attention au choix de l’emplacement du ou des bouton(s) d’action(s).
  • Important : N’hésitez pas à faire plusieurs maquettes et des tests utilisateurs.

 
0

Optimiser une Landing page pour les nazes

Posted by admin on mar 12, 2010 in My life

Vous êtes naze en landing page, vous ne savez même pas ce que c’est ? Pas grave, vous allez rapidement devenir un expert. En collaboration avec Fred de Conseils Marketing, nous vous vous proposons la cette partie 1, dans laquelle on voit point par point comment il faut réfléchir avant d’agir.
Une landing pages ou page d’atterrissage, est une page d’entrée de votre site, sachant que les internautes ne vont pas forcément arriver par la page d’accueil. L’internaute peut venir d’une campagne pub, d’un lien de référencement naturel, d’un email, d’un lien donné via un autre support (presse, radio, brochure, etc.).

Dans le cadre d’une campagne Adwords, la landing page est particulièrement importante (Ma landing page lave plus blanc).
En effet, la qualité de votre page d’atterrissage et donc de vos annonces est évaluée par Google à l’aune de critères tels que le temps de chargement de la page, le nombre de liens sur la page, la pertinence des informations fournies, etc.

En optimisant cette page avec un peu de bon sens, vous améliorerez votre campagne sans augmenter votre budget Adwords.

OBJECTIFS
Où vais-je ? Dans quel état j’erre ? Ou comment définir vos indicateurs de performance (ndrl : même si vos résultats sont mauvais, on appelle ça « performance » parce que ça sonne mieux que « indicateurs de nullité »)

Il s’agit de déterminer le plus précisément possible les objectifs de cette page, les quantifier et ensuite les hiérarchiser. Plus facile à dire qu’à faire, mais ce sera votre ligne directrice tout au cours du projet ; et d’autre part, lorsque vous testerez et retesterez encore, vous pourrez mesurer l’évolution et savoir où vous en êtes. Les indicateurs clés choisis en général sont :
-    le taux de rebond: c’est-à-dire le pourcentage des internautes qui sont venus sur votre page et qui sont repartis aussitôt car ce qu’il ont trouvé sur votre page ne correspondait pas à ce qu’ils cherchaient. Techniquement c’est lorsque l’internaute clique de suite vers un lien externe de votre page, ferme l’onglet ou le navigateur internet, tape une nouvelle URL, ou fait « Précédent »…
-    le taux de conversion : c’est le pourcentage de visiteurs ayant réalisé l’action que vous souhaitez qu’ils fassent (ex: acheter le produit, souscrire à une newsletter, remplir un formulaire…). Le taux de conversion oscille entre 2% et 20%, selon le contexte. Ce sont des chiffres très génériques, tout dépend de la spécificité de votre marché, mais au moins, ça vous donne un ordre de grandeur.
-    la durée et le nombre/la fréquence de visites : La durée de visite vous donne une idée de l’intérêt porté à votre contenu). Le nombre de visiteurs uniques (nombre de visiteurs venus un ou plusieurs fois mais comptés seulement une seule fois) et le nombre de visites globale et la fréquence de visite vous permettront de mieux comprendre les habitudes de vos internautes. Par exemple, si vous faîtes une offre valable une fois par personne, il faut que le taux de nouveaux visiteurs soit faible… sinon cela veut dire que vous payez à nouveau pour une personne qui connaît déjà votre offre.
-    le CTR sur Google (Clic Through Rate) c’est le taux de clic de votre annonce, c’est-à-dire le rapport entre le nombre de clic divisé par le nombre de fois que votre publicité a été affichée (impressions). Bien entendu plus ce nombre est important, plus cela veut dire que votre annonce est pertinente (ciblage et texte). Un taux moyen se situe autour de 2-3 % et les meilleurs taux atteignent 20%.
On néglige souvent cette partie qui nécessite de se creuser la tête, et qui en plus prend beaucoup de temps, mais c’est la base. Gardez bien en tête de trouver les quelques 3 ou 4 indicateurs clés utiles et pertinents dans toute la masse de données chiffrées que vous pouvez trouver. Fixez les objectifs à atteindre pour chaque chiffre clé et déterminez les priorités. 

LA CIBLE
Le plus sur moyen de manquer votre cible, c’est de ne pas en avoir. Le plus sûr moyen de ne pas avoir de chance, c’est de ne pas en avoir (proverbe chinois)
Qui souhaitez-vous attirer ? Quelles sont leurs motivations ? Que recherchent-ils ? Fréquence de visite ? Quel vocabulaire utilisent-ils ?

Peut-être qu’il vous faudra segmenter vos cibles et créer une landing page spécifique en fonction de chaque cible. Par exemple,  pour cette pub Carling, l’argument vendeur « Fait avec 100% d’orge britannique » est un contre-argument. Capitaine qui est aussi un spécialiste en bières, ne me contredira pas si je dis que la Carling est comme du pipi de chat à qui on aurait fait boire de l’eau gazeuse.

LE CONTEXTE
La solidité d’un système se mesure à la résistance de son maillon le plus faible (Laurence Boccolini)

La page d’atterrissage est souvent pensée comme UNE page alors qu’il s’agit d’un maillon.

Pour en faire un maillon fort, il faut prendre en compte d’où l’internaute arrive et ce qui se passe quand il repart de la landing page. Vient-il d’un moteur de recherche après avoir cliqué sur un lien naturel ou un lien sponsorisé ? Vient-il d’un email ? D’un support papier ? Que dit le message en amont, quelle est la promesse faite à l’internaute ?

Vous avez bien en tête le souvenir désagréable d’une promesse alléchante qui vous a fait cliquer, et vous vous êtes ensuite retrouvé sur une page qui n’avait plus rien à voir avec le message. Grosse déception !

En plus de cet enchaînement, il vous faut lister les facteurs externes qui ont un impact. Par exemple :
- Quelles sont les heures / jours / lieux de connexion ? Est-ce que les internautes se connectent en semaine ou le week-end, est-ce une connexion mobile ou internet ? Est-ce qu’ils sont au travail ou chez eux ?
- Est-ce qu’il y a un impact saisonnier ou un événement marquant (salon, soldes, réaction de la concurrence, vacances, fêtes) ?
- Contraintes techniques (type de navigateur, résolution, système d’exploitation, contrôle parental, plugs-in, vitesses de connexion, etc.)

ça vous permet de bien poser le contexte, de ne pas se focaliser uniquement sur VOTRE landing page, mais sur l’enchaînement effectué par l’internaute.

Ça vous paraît inutile ? Laborieux ? Ces trois paramètres, objectifs, cible et contexte sont intimement liés. Il suffit par exemple que l’on soit en période de soldes (contexte) ou que les internautes aient moins de budget (cible) ou que ce soit un mois avec beaucoup de jours fériés et de ponts (contexte), pour que votre projet prenne une tournure différente.

Par exemple, l’objectif de conversion sera peut-être moins ambitieux sur une cible de personnes âgées qui se connectent de chez elles après le feuilleton télé que sur une cible de professionnels qui se connectent sur le lieu de travail pendant les horaires de bureau, et pourtant vous leur vendez le même produit, des collants verts fluo (Mince ! Capitaine, j’ai révélé ton deuxième boulot à notre lectorat). 

Maintenant il vous reste à briefer votre agence et à préparer les tests sur votre page.

 
0

Comment simuler un click en javascript ?

Posted by admin on fév 15, 2010 in Javascript

Pour une raison quelconque, vous souhaitez simuler un click sur un lien, sur l’evenement onmouseover par exemple… en voici la solution:
le parametre “element” est la string de l’id a cliquer

 function click_me(element)
 {
      try
   {//pour ie
  document.getElementById(element).click();
   }catch(e)
   {//pour ff
    var evt = document.createEvent(“MouseEvents”); // créer un évennement souris
    evt.initMouseEvent(“click”, true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);  // intiailser l’évennement déja crée par un click
    var cb = document.getElementById(element); // pointe sur l’élement
    cb.dispatchEvent(evt);  // envoyer l’évennement vers l’élement
   }
 }

C’est pas super propre, mais ca marche parfaitement que ce soit sur ie ou sur ff (ou chrome ou opéra..)

 
0

Evaluation par étoiles

Posted by admin on août 19, 2009 in Javascript

Voici un petit script developpé suite à une question sur le forum.
Il s’agit d’une petite animation pour enregistrer un vote de 1 à 5 étoiles

html>
 
<head>
<meta http-equiv=“Content-Type” content=“text/html; charset=windows-1252″>
<title>StarRating</title>
<script type=‘text/javascript’>
var done=false
var pic = new Array();
pic[0]=new Image();
pic[0].src=”star1.gif”;
pic[1]=new Image();
pic[1].src=”star2.gif”;
var bareme = new Array(“peu “,”passablement “,”moyennement”,”presque”,”")
 
function rate(level){
if (done){return false;}
  for(i=1;i<6;i++){ document.getElementById(‘_’+i).src=(level<i)?pic[0].src:pic[1].src;
  document.getElementById(‘vote’).innerHTML=“Votre vote : “+level+” étoile(s)   “+bareme[level-1]+” satisfaisant”
  }
  }
 
function zero(){
     for(i=1;i<6;i++){ document.getElementById(‘_’+i).src=pic[0].src;
     done=false;
     document.getElementById(‘vote’).innerHTML=“Votre vote : 0 étoile(s)”
 
     }
     }
function valider(){
done=true;
document.getElementById(‘vote’).innerHTML+=‘   VALID&Eacute;’
}
     
  </script>

</head>
 
<body>
Clickez sur l’étoile de votre choix pour valider le vote:<br /><br />
<img src=“star1.gif” id=‘_1′ onclick=“valider()” onmouseover=“rate(1)” /><img src=“star1.gif” id=‘_2′ onclick=“valider()”  onmouseover=“rate(2)” /><img src=“star1.gif” id=‘_3′ onclick=“valider()”  onmouseover=“rate(3)” /><img src=“star1.gif” id=‘_4′ onclick=“valider()”  onmouseover=“rate(4)”  /><img src=“star1.gif” id=‘_5′ onclick=“valider()”  onmouseover=“rate(5)”  />
<br /><br/>
<div id=“vote”>Votre vote : 0 étoile(s) </div><br /><br/>
<input type=“button” onclick=“zero();” value=“reset”/>
</body>
 
</html>

 
-

RECAPTCHA Component & Helper for CakePHP

Posted by admin on août 19, 2009 in Cake Php

Source : http://bakery.cakephp.org/articles/view/recaptcha-component-helper-for-cakephp

This is an easy to use component and helper set for you to get reCAPTCHA(including mailhide) running on your website now. If you don’t know what reCAPTCHA is please head to http://recaptcha.net/ now to find out! Please note this code is largely derived off of the library provided for reCAPTCHA – it’s just repurposed for ease of use in CakePHP.

Create the following files:
Download code app/controllers/components/recaptcha.php 
app/views/helpers/recaptcha.php

code for app/controllers/components/recaptcha.php

Component Class:

<?php 
 
class RecaptchaComponent extends Object 
{
    var 
$publickey “”
;
    var 
$privatekey“”
;
    
    var 
$is_valid false
;
    var 
$error “”
;
    
    function 
startup(&$controller
){
        
Configure::write(“Recaptcha.apiServer”,“http://api.recaptcha.net”
);
        
Configure::write(“Recaptcha.apiSecureServer”,“https://api-secure.recaptcha.net”
);
        
Configure::write(“Recaptcha.verifyServer”,“api-verify.recaptcha.net”
);
        
Configure::write(“Recaptcha.pubKey”$this->publickey
);
        
Configure::write(“Recaptcha.privateKey”$this->privatekey
);
        
        
$this->controller =& $controller
;
        
$this->controller->helpers[] = “Recaptcha”
;
    }
    
    function 
valid($form
){
        if (isset(
$form['recaptcha_challenge_field']) && isset($form['recaptcha_response_field'
])){
            if(
$this->recaptcha_check_answer
(
                
$this->privatekey

                
$_SERVER["REMOTE_ADDR"
],
                
$form['recaptcha_challenge_field'
], 
                
$form['recaptcha_response_field'
]
            ) == 
0
)
                return 
false
;            if (

$this->is_valid$this->is_valid

)
                return 
true
;
        }
        return 
false
;
    }
    
    
/**
      * Calls an HTTP POST function to verify if the user’s guess was correct
      * @param string $privkey
      * @param string $remoteip
      * @param string $challenge
      * @param string $response
      * @param array $extra_params an array of extra variables to post to the server
      * @return ReCaptchaResponse
      */
    
function recaptcha_check_answer ($privkey$remoteip$challenge$response$extra_params 
= array()){
        if (
$privkey == null || $privkey == 
){
            die (
“To use reCAPTCHA you must get an API key from <a href=’http://recaptcha.net/api/getkey’>http://recaptcha.net/api/getkey</a>”
);
        }
    
        if (
$remoteip == null || $remoteip == 
){
            die (
“For security reasons, you must pass the remote ip to reCAPTCHA”
);
        }        
            
            
//discard spam submissions
            
if ($challenge == null || strlen($challenge) == || $response == null || strlen($response) == 0
) {
                    
$this->is_valid false
;
                    
$this->error ‘incorrect-captcha-sol’
;
                    return 
0
;
            }            

$response $this->_recaptcha_http_post(Configure::read(‘Recaptcha.verifyServer’), “/verify”$response $this->_recaptcha_http_post(Configure::read(‘Recaptcha.verifyServer’), “/verify”

,
                                              array (
                                                     
‘privatekey’ => $privkey
,
                                                     
‘remoteip’ => $remoteip
,
                                                     
‘challenge’ => $challenge
,
                                                     
‘response’ => 
$response
                                                     
) + 
$extra_params
                                              
);
    
            
$answers explode (“\n”$response [1
]);
            
            if (
trim ($answers [0]) == ‘true’
) {
                    
$this->is_valid true
;
                    return 
1
;
            }else{
                    
$this->is_valid false
;
                    
$this->error $answers [1
];
                    return 
0
;
            }
    }
    
    
    
/**
     * Submits an HTTP POST to a reCAPTCHA server
     * @param string $host
     * @param string $path
     * @param array $data
     * @param int port
     * @return array response
     */
    
function _recaptcha_http_post($host$path$data$port 80
) {        

$req $this->_recaptcha_qsencode ($data$req $this->_recaptcha_qsencode ($data

);        

$http_request  “POST $path HTTP/1.0\r\n”$http_request  “POST $path HTTP/1.0\r\n”

;
        
$http_request .= “Host: $host\r\n”
;
        
$http_request .= “Content-Type: application/x-www-form-urlencoded;\r\n”
;
        
$http_request .= “Content-Length: ” strlen($req) . “\r\n”
;
        
$http_request .= “User-Agent: reCAPTCHA/PHP\r\n”
;
        
$http_request .= “\r\n”
;
        
$http_request .= $req
;        

$response $response 

;
        if( 
false == ( $fs = @fsockopen($host$port$errno$errstr10
) ) ) {
                die (
‘Could not open socket’
);
        }        

fwrite($fs$http_requestfwrite($fs$http_request

);        while ( !

feof($fsfeof($fs

) )
                
$response .= fgets($fs1160); 
// One TCP-IP packet
        
fclose($fs
);
        
$response explode(“\r\n\r\n”$response2
);        return 

$response$response

;
    }
    
    
    
/**
     * Encodes the given data into a query string format
     * @param $data - array of string elements to be encoded
     * @return string - encoded request
     */
    
function _recaptcha_qsencode ($data
) {
        
$req “”
;
        foreach ( 
$data as $key => $value 
)
                
$req .= $key ‘=’ urlencodestripslashes($value) ) . ‘&’
;        

 

// Cut the last ’&’
        
$req=substr($req,0,strlen($req)-1
);
        return 
$req
;
    }
}
?>

code for app/views/helpers/recaptcha.php

Helper Class:

Download code <?php 
class RecaptchaHelper extends AppHelper {
    var 
$helpers = array('form'); 
    
    function 
display_form($output_method 'return'$error null$use_ssl false){
        
$data $this->__form(Configure::read("Recaptcha.pubKey"),$error,$use_ssl);
        if(
$output_method == "echo")
            echo 
$data;
        else
            return 
$data;
    }
    
    function 
hide_mail($email '',$output_method 'return'){
        
$data $this->recaptcha_mailhide_html(Configure::read('Recaptcha.pubKey'), Configure::read('Recaptcha.privateKey'), $email);
        if(
$output_method == "echo")
            echo 
$data;
        else
            return 
$data;
    }
    
    
/**
     * Gets the challenge HTML (javascript and non-javascript version).
     * This is called from the browser, and the resulting reCAPTCHA HTML widget
     * is embedded within the HTML form it was called from.
     * @param string $pubkey A public key for reCAPTCHA
     * @param string $error The error given by reCAPTCHA (optional, default is null)
     * @param boolean $use_ssl Should the request be made over ssl? (optional, default is false)
    
     * @return string - The HTML to be embedded in the user's form.
     */
    
function __form($pubkey$error null$use_ssl false){
        if (
$pubkey == null || $pubkey == '') {
            die (
"To use reCAPTCHA you must get an API key from <a href='http://recaptcha.net/api/getkey'>http://recaptcha.net/api/getkey</a>");
        }
        
        if (
$use_ssl) {
                    
$server Configure::read('Recaptcha.apiSecureServer');
            } else {
                    
$server Configure::read('Recaptcha.apiServer');
            }
    
            
$errorpart "";
            if (
$error) {
               
$errorpart "&amp;error=" $error;
            }
            return 
'<script type="text/javascript" src="'$server '/challenge?k=' $pubkey $errorpart '"></script>
    
        <noscript>
              <iframe src="'
$server '/noscript?k=' $pubkey $errorpart '" height="300" width="500" frameborder="0"></iframe><br/>
                  <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea>
                <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
              <input type="hidden" name="recaptcha_response_field" value="manual_challenge"/>
        </noscript>'
;
    }
/* Mailhide related code */
    
function _recaptcha_aes_encrypt($val,$ky) {
        if (! 
function_exists ("mcrypt_encrypt")) {
            die (
"To use reCAPTCHA Mailhide, you need to have the mcrypt php module installed.");
        }
        
$mode=MCRYPT_MODE_CBC;   
        
$enc=MCRYPT_RIJNDAEL_128;
        
$val=$this->_recaptcha_aes_pad($val);
        return 
mcrypt_encrypt($enc$ky$val$mode"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");
    }
    
    function 
_recaptcha_mailhide_urlbase64 ($x) {
        return 
strtr(base64_encode ($x), '+/''-_');
    }
    
    
/* gets the reCAPTCHA Mailhide url for a given email, public key and private key */
    
function recaptcha_mailhide_url($pubkey$privkey$email) {
        if (
$pubkey == '' || $pubkey == null || $privkey == "" || $privkey == null) {
            die (
"To use reCAPTCHA Mailhide, you have to sign up for a public and private key, " .
                 
"you can do so at <a href='http://mailhide.recaptcha.net/apikey'>http://mailhide.recaptcha.net/apikey</a>");
        }
        
    
        
$ky pack('H*'$privkey);
        
$cryptmail $this->_recaptcha_aes_encrypt ($email$ky);
        
        return 
"http://mailhide.recaptcha.net/d?k=" $pubkey "&c=" $this->_recaptcha_mailhide_urlbase64 ($cryptmail);
    }
    
    
/**
     * gets the parts of the email to expose to the user.
     * eg, given johndoe@example,com return ["john", "example.com"].
     * the email is then displayed as john...@example.com
     */
    
function _recaptcha_mailhide_email_parts ($email) {
        
$arr preg_split("/@/"$email );
    
        if (
strlen ($arr[0]) <= 4) {
            
$arr[0] = substr ($arr[0], 01);
        } else if (
strlen ($arr[0]) <= 6) {
            
$arr[0] = substr ($arr[0], 03);
        } else {
            
$arr[0] = substr ($arr[0], 04);
        }
        return 
$arr;
    }
    
    
/**
     * Gets html to display an email address given a public an private key.
     * to get a key, go to:
     *
     * http://mailhide.recaptcha.net/apikey
     */
    
function recaptcha_mailhide_html($pubkey$privkey$email) {
        
$emailparts $this->_recaptcha_mailhide_email_parts ($email);
        
$url $this->recaptcha_mailhide_url ($pubkey$privkey$email);
        
        return 
htmlentities($emailparts[0]) . "<a href='" htmlentities ($url) .
            
"' onclick=\"window.open('" htmlentities ($url) . "', '', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=500,height=300'); return false;\" title=\"Reveal this e-mail address\">...</a>@" htmlentities ($emailparts [1]);
    
    }
        
?>

To use the reCAPTCHA system load the component

    

}

Controller Class:

Download code <?php 
var $components = array('Recaptcha'); 
?>

After you save the component and helper and initiate them, set your public & private keys in “beforeFilter” of your controller to the ones you received when you signed up on the reCAPTCHA website.

Controller Class:

Download code <?php 
function beforeFilter(){
   
$this->Recaptcha->publickey "";
   
$this->Recaptcha->privatekey "";
}
?>

in the view, the helper can be used to verify form submissions or hide your e-mail addresses (NOTE: mcrypt is required for this.)

Controller Class:

Download code <?php 
//create the reCAPTCHA form.
 
$recaptcha->display_form('echo')//hide an e-mail address
 
$recaptcha->hide_mail("someuser@somdomain.tld",'echo');
?>

 

in the controller to verify a form submission using reCAPTCHA do the following.

Controller Class:

Download code <?php 
if(

 
0

Tester le niveau de sécurité d’un mot de passe

Posted by admin on août 19, 2009 in Javascript

source : http://www.editeurjavascript.com/scripts/scripts_formulaires_3_690.php

Code :

Entre <HEAD> et </HEAD> :
<style type=”text/css”>
#weak, #medium
{
 border-right:solid 1px #DEDEDE;
}

#sm
{
 margin:0px;
 padding:0px;
 height:14px;
 font-family:Tahoma, Arial, sans-serif;
 font-size:9px;
}

#sm ul
{
 border:0px;
 margin:0px;
 padding:0px;
 list-style-type:none;
 text-align:center;
}

#sm ul li
{
 display:block;
 float:left;
 text-align:center;
 padding:0px 0px 0px 0px;
 margin:0px;
 height:14px;
}

.nrm
{
 width:84px;
 color:#adadad;
 text-align:center;
 padding:2px;
 background-color:#F1F1F1;
 display:block;
 vertical-align:middle;
}

.red
{
 width:84px;
 color:#FFFFFF;
 text-align:center;
 padding:2px;
 background-color:#FF6F6F;
 display:block;
 vertical-align:middle;
}

.yellow
{
 width:84px;
 color:#FFFFFF;
 text-align:center;
 padding:2px;
 background-color:#FDB14D;
 display:block;
 vertical-align:middle;
}

.green
{
 width:84px;
 color:#FFFFFF;
 text-align:center;
 padding:2px;
 background-color:#A0DA54;
 display:block;
 vertical-align:middle;
}
</style>
<script type=”text/javascript”>
function evalPwd(s)
{
 var cmpx = 0;
 
 if (s.length >= 6)
 {
  cmpx++;
  
  if (s.search(“[A-Z]“) != -1)
  {
   cmpx++;
  }
  
  if (s.search(“[0-9]“) != -1)
  {
   cmpx++;
  }
  
  if (s.length >= 8 || s.search(“[\x20-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]“) != -1)
  {
   cmpx++;
  }
 }
 
 if (cmpx == 0)
 {
  document.getElementById(“weak”).className = “nrm”;
  document.getElementById(“medium”).className = “nrm”;
  document.getElementById(“strong”).className = “nrm”;
 }
 else if (cmpx == 1)
 {
  document.getElementById(“weak”).className = “red”;
  document.getElementById(“medium”).className = “nrm”;
  document.getElementById(“strong”).className = “nrm”;
 }
 else if (cmpx == 2)
 {
  document.getElementById(“weak”).className = “yellow”;
  document.getElementById(“medium”).className = “yellow”;
  document.getElementById(“strong”).className = “nrm”;
 }
 else
 {
  document.getElementById(“weak”).className = “green”;
  document.getElementById(“medium”).className = “green”;
  document.getElementById(“strong”).className = “green”;
 }
}
</script>

Entre <BODY> et </BODY> :
<form>
<input type=”text” size=”24″ onkeyup=”evalPwd(this.value);” /><br /><div id=”sm”><ul><li id=”weak” class=”nrm”>Faible</li><li id=”medium” class=”nrm”>Moyen</li><li id=”strong” class=”nrm”>Fort</li></ul></div>
</form><noscript><a href=”http://www.editeurjavascript.com/”>ajax</a></noscript>

 
0

Géolocalisation par adresse IP avec iplocationtools

Posted by admin on août 19, 2009 in Php

source : http://blog.arnaud-k.fr/2009/developpement-web/cat-php/api-geolocalisation-dadresse-ip-avec-iplocationtools/

 

J’avais un peu étudié les différentes solutions d’API de géolocalisation d’adresse IP il y a quelques temps. J’étais sur cette solution tout simple : iplocationtools.

Iplocationtools est une API que l’on peut appeler directement en PHP (voir le code ci-dessous). Cela crée un fichier XML contenant toutes les infos nécessaires à la géolocalisation (pays, region, ville, latitude et longitude principalement). Il ne reste plus qu’à le parser.

Code à intégrer pour appeler l’API :

function locateIp($ip){
    $d = file_get_contents("http://www.iplocationtools.com/ip_query.php?ip=$ip&output=xml"); // on charge l'api
 
    if (!$d)
        return false; // Failed to open connection
 
    $answer = new SimpleXMLElement($d);
 
    if ($answer->Status != 'OK')
        return false; // Invalid status code
 
        $country_code = $answer->CountryCode;
        $country_name = $answer->CountryName;
        $region_name = $answer->RegionName;
        $city = $answer->City;
        $zippostalcode = $answer->ZipPostalCode;
        $latitude = $answer->Latitude;
        $longitude = $answer->Longitude;
 
        //Return the data as an array
    return array('latitude' => $latitude, 'longitude' => $longitude, 'zippostalcode' => $zippostalcode, 'city' => $city, 'region_name' => $region_name, 'country_name' => $country_name, 'country_code' => $country_code, 'ip' => $ip);
}

 
0

Détecter le navigateur de l’internaute

Posted by admin on août 19, 2009 in Php

<?
if (eregi(‘msie’, $HTTP_USER_AGENT) && !eregi(‘opera’, $HTTP_USER_AGENT))
{
    // Internet Explorer
$navigateur=“Internet Explorer”;
}
elseif (eregi(‘opera’, $HTTP_USER_AGENT))
{
    // Opera
$navigateur=“Opera”;
}
elseif (eregi(‘Mozilla/4.’, $HTTP_USER_AGENT))
{
    // Netscape 4.x
$navigateur=“Netscape 4.x”;
}
elseif (eregi(‘Mozilla/5.0′, $HTTP_USER_AGENT) && !eregi(‘Konqueror’, $HTTP_USER_AGENT))
{
    // Netscape 6
$navigateur=“Netscape 6.x”;
}
else
{
    // Autres navigateurs
$navigateur=“Navigateur inconnu”;
}
echo $navigateur;
?>

 
0

Parsing XML files with CakePHP

Posted by admin on août 19, 2009 in Cake Php

source : http://bakery.cakephp.org/articles/view/parsing-xml-files-with-cakephp

Simple tutorial for parsing xml files quickly using the core XML class of cakephp.
After spending one whole evening, I found out CakePHP has its own XML class for handling xml files. In the meantime, i tried SimplePie (for RSS only, not XML), SimpleXML, and XMLize. But still they werent of any great help compared to cakephp’s core XML class (and some Sets).

How to parse it then?
First of all, you need to import the XML class in your controller class using App::import(). Here is the controller class parsing a particular xml file and printing out (like print_r) the returned array.

Controller Class:

<?php 
  class ParseController extends AppController {
  var 
$name "Parse";
  var 
$uses = array('MyModel'

);
  function xml() {
    
// import XML class
    
App::import('Xml'

);
    // your XML file's location
    
$file "my_xml_file.xml"

;
    // now parse it
    
$parsed_xml =& new XML($file);
    
$parsed_xml Set::reverse($parsed_xml); 

// this is what i call magic
    // see the returned array
    debug($parsed_xml

);
  }
}
?>
 

 

 
0

Comment supprimer les doublons dans une table ?

Posted by admin on fév 24, 2009 in Mysql

Voici une technique rapide pour supprimer les doublons dans une table tout en évitant de faire un script php..

Création de la table

Pour l’exemple je vous propose de créer une table ‘membre’ simple :

CREATE TABLE membre (
id int(10) NOT NULL AUTO_INCREMENT,
nom varchar(30),
prenom varchar(30),
age int(3),
datecreation timestamp NOT NULL default CURRENT_TIMESTAMP,
PRIMARY KEY (id)
);

Nous admettrons que l’unicité est basée sur la composition du nom et prénom, c’est à dire que deux personnes physiquement différentes ne peuvent avoir le même couple de nom+prénom (ce qui dans la réalité n’est bien sûr pas valable).

Insertion de champs avec un doublon

Insérons 4 champs, les deux premiers étant identiques (doublons) :

INSERT INTO membre (nom,prenom,age) values ('durand','marc',34);
INSERT INTO membre (nom,prenom,age) values ('durand','marc',34);
INSERT INTO membre (nom,prenom,age) values ('hurni','michael',22);
INSERT INTO membre (nom,prenom,age) values ('morin','luc',52);
Vérifions que les champs soient bien présents dans la base :
 
SELECT * FROM membre;
+----+--------+---------+------+---------------------+
| id | nom    | prenom  | age  | datecreation        |
+----+--------+---------+------+---------------------+
|  1 | durand | marc    |   34 | 2008-11-21 20:16:57 |
|  2 | durand | marc    |   34 | 2008-11-21 20:16:57 |
|  3 | hurni  | michael |   22 | 2008-11-21 20:16:57 |
|  4 | morin  | luc     |   52 | 2008-11-21 20:16:57 |
+----+--------+---------+------+---------------------+
 
Nous observons que Marc Durand est bien en double dans la base de données, il y a donc un
doublon (en admettant qu’il n’y ait qu’un seul Marc Durand sur terre).

Création d’un index d’unicité

Cet index va permettre de supprimer les enregistrements comportant certains champs identiques,
 nom et prénom pour mon cas :

 
ALTER IGNORE TABLE membre ADD UNIQUE INDEX(nom,prenom);
Query OK, 4 rows affected (0.46 sec)
Records: 4  Duplicates: 1  Warnings: 0
MySQL nous indique qu’un doublon a été supprimé (duplicate).

Interrogation de la table

 Vérifions que le deuxième ‘Marc Durand’ n’est plus dans la table :
select * from membre;
+----+--------+---------+------+---------------------+
| id | nom    | prenom  | age  | datecreation        |
+----+--------+---------+------+---------------------+
|  1 | durand | marc    |   34 | 2008-11-21 20:16:57 |
|  3 | hurni  | michael |   22 | 2008-11-21 20:16:57 |
|  4 | morin  | luc     |   52 | 2008-11-21 20:16:57 |
+----+--------+---------+------+---------------------+
3 rows in set (0.00 sec)

L’enregistrement ayant pour identifiant ‘2′ a bien été supprimé.

Suppression de l’index

Si vous ne souhaitez pas préserver cet d’unicité, bien qu’il interdise les doublons à

l’insertion, vous pouvez le supprimer :

ALTER TABLE membre DROP INDEX nom; Query OK, 3 rows affected (0.38 sec) Records: 3  Duplicates: 0  Warnings: 0

Vérification de la structure en ligne de commande :

[code]desc membre;
+————–+————-+——+—–+——————-+—————-+
| Field        | Type        | Null | Key | Default           | Extra          |
+————–+————-+——+—–+——————-+—————-+
| id           | int(10)     | NO   | PRI | NULL              | auto_increment |
| nom          | varchar(30) | YES  | MUL | NULL              |                |
| prenom       | varchar(30) | YES  |     | NULL              |                |
| age          | int(3)      | YES  |     | NULL              |                |
| datecreation | timestamp   | NO   |     | CURRENT_TIMESTAMP |                |
+————–+————-+——+—–+——————-+—————-+
5 rows in set (0.07 sec)[/code]

Conclusion

Il existe plusieurs techniques de suppression des doublons MySQL,
les plus mauvaises étant celles préconisant l’usage d’un langage tiers (php, bash, etc.)
 basées sur un parcours en boucle de la table car trop consommatrices en ressources.
 Sachez qu’il est bien plus rentable d’utiliser les fonctions natives du moteur SQL,
 quitte à faire fonctionner un tant soit peu ses méninges et consulter la documentation
MySQL (ou autre moteur SQL suivant celui utilisé ;) ). Cette solution étant rapide et fiable,
 j’espère que vous en aurez l’utilité.