22 Feb 2009Pour le projet sur lequel je travaille actuellement, je dois tester la validatée d'un numero de SIRET. D'après Wikipédia les numéros de SIRET possèdent une clé finale permettant de vérifier qu'ils soient biens formés.
J'ai donc retranscris ce calcul sous une règle de validation pour cakePHP, le voici :
function validateSiret($data, $field) {
$siret = r(' ', '', $data[$field]);
$sum = 0;
for($i=0;$i!=14;$i++) {
$tmp = ((($i+1)%2)+1) * intval($siret[$i]);
if ($tmp>=10) $tmp-=9;
$sum+=$tmp;
}
return ($sum%10===0);
}
Tout d'abord, je m'assure que le siret ne contienne pas d'espace. Puis je passe nombre après nombre pour calculer la somme (je multiplie par deux les nombres d'index pair et par un ceux d'index impair). Si le résultat est supérieur à 10, j'additionne chaque chiffre entre eux (ce qui équivant à soustraire 9).
Si le résultat final est congru à 10, alors le numero de SIRET est valide.
Il ne reste plus qu'à l'ajouter à mes régles de validation :
var $validate = array(
'siret' => array(
'rule' => array('validateSiret', 'siret'),
'message' => "Le numero de SIRET indiqué n'est pas valide."
)
);
Mais ce n'est pas tout. Comme pour mes tests je crée à la volée des dizaines d'enregistrements, j'avais besoin d'un générateur automatique de numero de SIRET valides. Voici ce que j'ai fini par écrire :
public function siret() {
//On génère le début du numero de siret
$siret = '';
$sum = 0;
for($i=0;$i!=8;$i++) {
$rand = mt_rand(0,9);
$siret.=$rand;
//On ajoute une fois le résultat si index impair, deux fois sinon
$tmp = $rand * (1+($i+1)%2);
if ($tmp>=10) $tmp-=9;
$sum+=$tmp;
}
//On ajoute 4 zeros
$siret.="0000";
//On regarde combien il me manque pour etre congru à 10
$diff = 10-($sum%10);
if ($diff>2) {
$first = floor($diff/3);
$second = $diff-(2*$first);
$siret.=$first.$second;
} else {
$siret.='0'.$diff;
}
return preg_replace("/([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{5})/", "$1 $2 $3 $4", $siret);
}
Le principe consiste à générer les 8 premiers nombres de façon complétement aléatoire et d'en calculer la "somme" (selon le principe évoqué au dessus). Puis on ajoute des zero pour combler l'espace jusqu'à ajouter la clé de vérification.
Bien sur, la clé on va la créer pour que la somme de (2 x le premier chiffre) + (1 x le second) soit égal à ce qu'il nous manque pour être congru à 10.
Et on fini par retourner le numero de façon lisible, par exemple : 774 082 010 00034.
J'ai fait une petite recherche sur societe.com, aucun de mes numeros générés ne semble donner de résultat, malgré tout ils sont syntaxiquement valides.
21 Feb 2009Pour un projet sur lequel je suis en ce moment, je dois faire une interface d'administration assez complexe, le tout en AJAX.
Je dois manipuler des données sorties de ma base de donnée, venant de trois modèles différents, mais liés les uns avec les autres. Autant dire que j'ai de gros tableaux imbriqués de données. La page travaille vraiment beaucoup et manipule ces données constamment.
Pour éviter d'avoir à faire une requete sur ma base à chaque fois que j'ai besoin d'une information, j'ai décidé de tout charger une première fois au chargement de la page, puis de modifier coté client les variables sur lesquelles je travaille, pour ne faire des requetes au serveur qu'en upload (update/add) et ainsi éviter au maximum les requetes en download inutiles.
Pour ça, j'utilise tout d'abord le base64 de php pour passer des objets complexes (au format JSON) à mes scripts. Muhammad Hussein Fattahizadeh a pour cela mis à disposition une retranscription de l'encodage/decodage en base64 pour jQuery.
Je peux stocker ainsi mes objets de façon "dormante" dans ma page, et les décoder pour récupérer/modifier les valeurs dont j'ai besoin avant de les réencoder et de les re-ranger dans mon DOM. L'avantage de stocker ces informations en base64 c'est que je ne risque pas de causer d'erreur de syntaxe, de balise non fermée, de caractère interdit, même si je manipule des objets contenant du code HTML et que j'ai besoin de le stocker dans mon propre DOM.
J'utilise aussi à coté de ça le parseur officiel JSON pour parser mes éléments JSON. Il ne me reste plus qu'à passer mon élément JSON en paramètre aux fonction AJAX de jQuery pour mettre à jour mes données.
20 Feb 2009CakePHP permet de créer très facilement des formulaires dont l'action (add/edit) ainsi que les champs sont remplis automatiquement grâce à FormHelper::create
et FormHelper::end
.
Il prends pour cela les variables contenues dans le $data du controller, qui sont alors passées au $data de la vue.
Si on veut changer le modèle et/ou les valeurs utilisées par le formulaire, il suffit de faire nos modifications dans le $this->data
directement dans la vue avant d'appeller $form->create()
.
Par contre, si sur une même page on possède plusieurs formulaires, tous d'un modele différent, l'astuce ne fonctionne plus. FormHelper s'est initialisé lors de son premier appel et utilisera le même set de model et valeurs pour les autres.
Même modifier $this->data
avant chaque appel à $form->create()
ne changera rien.
Il faut donc ruser et modifier la variable utilisée par le Helper, c'est à dire modifier $form->data
à partir du second formulaire.
19 Feb 2009En plus de son interface d'administration complète, Caracole permet un mode d'édition rapide directement accessible depuis le coté front-end des sites, pour corriger rapidement un titre ou un coquille qui se serait glissée quelque part.
Grâce à jQuery et cakePHP, cette fonctionnalité est très simple à utiliser. Il suffit pour cela d'avoir les droits d'administration sur le site que l'on veut modifier. Il suffit ensuite d'y naviguer avec un navigateur assez récent (cela signifie que IE6 n'y est pas convié) et s'affichera alors automatiquement en haut à gauche de l'écran un petit switch qui permet d'activer ou de désactiver en un clic le mode édition.
Lorsque le mode d'édition est activé, il suffit de cliquer sur une zone que l'on veut modifier pour la transformer automatiquement en champ de formulaire modifiable (avec intégration de tinyMCE pour les grands textes). Il suffit alors de modifier le texte exactement comme on peut le faire dans l'admin et de valider. La modification est prise en compte automatiquement.
Coté développeur, il suffit d'ajouter une class="editable" ainsi qu'un id formé de la forme "controller-champ-id". Ainsi id="posts-text-12" identifiera le champ "text" du 12e post.
C'est extremement pratique pour modifier des fautes de frappe, ou faire des tas de petites modifications, je m'en sers énormément et c'est un pas de plus pour faciliter l'administration à l'utilisateur final.
18 Feb 2009Le référencement est une des préocupations principales de nos clients, tous veulent savoir si avec le produit qu'on leur propose ils seront en mesure d'être les premiers dans les résultats Google.
Bien qu'il n'existe pas de recette miracle pour parvenir à ce résultat, certaines sociétés sont spécialisés dans ce business et déploient des trésors d'ingéniosité pour réussir à faire grimper les pages de leurs clients dans les index des moteurs.
Mais c'est un boulot à part entière, et ce n'est pas le nôtre. Nous faisons des sites web, à chacun sa spécialité.
Malgré tout, il existe plusieurs bonnes pratiques qui permettent d'obtenir de bons résultats sans trop d'efforts, et Caracole s'en sort pas trop mal de ce coté là.
Tout d'abord il tire parti de la façon dont les urls sont gérées par cakePHP, et donc aucune url ne contient de paramètre de la forme ?foo=bar&action=foobar qui sont très mal indexées. Chaque page possède donc sa propre url unique. Les méthodes d'url rewriting proposées de base par cakePHP sont très puissantes et font déjà une très grosse partie du travail.
Dans la même veine, il est possible de définir des 'slugs' pour chaque élément, un slug permet de donner un identifiant à chacune des pages, ce qui signifie qu'au lieu de retrouver un élément par son id dans l'url (un simple nombre, qui ne donne pas d'indication sur le contenu), on peut à la place le remplacer par un slug (du genre 'services', 'nous-contacter', etc). Cela donne des urls du genre /services.html, /posts/1:mon-premier-post, etc
Cela facilite le référencement des pages car des mots clés se rapportant au contenu de la page peuvent déjà être mis dans l'url, qui est une place privilégiée.
Ici encore, il suffit d'ajouter un champ 'slug' dans la table correspondante au modèle pour que celui-ci soit automatiquement généré à partir du nom (il est bien sur possible de le modifier si besoin).
Caracole est aussi doté d'un système de génération automatique de sitemap (le plan du site). Celui-ci est généré en deux versions, une version html pour vos visiteurs, et une version XML (qui indique les fréquences de réactualisations ainsi que les dates de dernière modification) pour les moteurs.
Et pour finir, je vais passer rapidement sur les essentiels : balise
et meta description différents pour chaque page, fichier robots.txt, texte alternatif sur les images et accessibilité du markup HTML mais bien sur, Caracole se charge de tout cela aussi.