PHP

field

Formidable: une autre vision des formulaires

0

Formidable est une bibliothèque PHP de gestion de formulaire un peu spéciale. Contrairement à l’approche habituelle, qui vous fait utiliser une API PHP pour spécifier et construire votre formulaire puis vous propose de l’utiliser pour faire un rendu, Formidable se base sur du code HTML, puis l’analyse pour construire une représentation manipulable du formulaire et ensuite l’afficher. Par exemple:

$form = new Gregwar\Formidable\Form('<form method="post">'
 .'What\'s your name? <input type="text" name="nom" />'
 .'<input type="submit" />'
 .'</form>');

$form->setValue('nom', 'Jack');

echo $form;

Ce bout de code construira un formulaire et en conservera une représentation intermédiaire, et il sera par exemple ici possible à l’aide de setValue() de définir la valeur d’un champ. Le echo $form affichera le formulaire, ce qui donnera quelque chose du genre:

<form method="post">What's your name?
<input type="text" name="nom" value="Jack" />

<input type="submit" />
<input type="hidden" name="csrf_token"
       value="9c14019138010ddee6766caaad8f2926b5b09fc7" /></form>

Comme vous le remarquez:

  • Le champ est requis par défaut, l’attribut required a été ajouté automatiquement
  • L’attribut value a été rempli par « Jack »
  • Un jeton CSRF a été automatiquement injecté dans le formulaire

Ce système permet alors de manipuler un formulaire d’une nouvelle manière, qui vous permettra de créer facilement des formulaires, et de les personnaliser à volonté.

Un autre exemple:

$form = new Gregwar\Formidable\Form('<form method="post">'
 .'How old are you? <input type="int" name="age" />'
 .'</form>');

echo $form;

Notez que le type int n’est pas valide et que les attributs min et max n’existent pas non plus en HTML. Ils seront utilisés pour générer une contrainte d’intégrité sur le champ et ne seront pas affichés, on obtiendra simplement un formulaire de la forme:

<form method="post">How old are you? <input type="text" name="age" />
<input type="hidden" name="csrf_token"
       value="fa88b988041aa1497b4200996c246c5f75d22e4c" /></form>

Et il sera possible de gérer la réception du formulaire comme cela:

$form->handle(function($values) {
    echo 'You are '.$values['age'].' years old!';
}, function($errors) {
    echo 'Errors:<br/>';
    foreach ($errors as $error) {
        echo "* $error <br/>";
    }
});

De cette manière, le formulaire vérifiera que l’ensemble de ses contraintes sont respectées, y compris le jeton csrf et appellera alors l’une des deux fonctions fournies en paramètre de handle().

La bibliothèque est sous licence MIT et vous propose aussi d’autre fonctionnalités, comme la possibilité d’alimenter des select ou des radios depuis du code, de placer des contraintes personnalisées, de récupérer les données ou de peupler les données depuis un objet mappé… Pour plus d’informations, n’hésitez pas à consulter le README de Gregwar/Formidable

Guide de conception PHP

2

Comme chacun le sait, il existe plusieurs PHP, du très bon au très mauvais. On trouve aujourd’hui sur internet de très (trop) nombreuses sources pour apprendre le PHP, des cours, leçons et tutoriels.

Je donne moi-même un cours de PHP à des étudiants de licence professionnelle, et aborder cet enseignement s’avère assez compliqué, car les étudiants parviennent en général à réaliser quelque chose de fonctionnel, en laissant malheureusement de nombreuses bonnes pratiques de coté, ou en utilisant des fonctionnalités obsolètes de PHP.

PHP est historiquement un langage très répandu et facile à utiliser, et les cours, tutoriels ou exemple que l’on trouve sur internet sont souvent préférés par les gens pour leur facilité de prise en main que pour leur qualités techniques.

Par exemple, le tutoriel numéro 1 de developpez.com sur le PHP (cf http://php.developpez.com/cours/) date de 2009, nous propose d’utiliser les obselètes fonctions mysql_connect & co, et de construire des requêtes non échappées par concaténation. Les cours du Site du Zéro ont l’air quant à eux de bien meilleure facture.

Suite aux projets de l’année dernière, j’ai pu lister quelques uns des problèmes les plus fréquents, et j’ai produit un guide de conception que l’on peut trouver ici:

http://gregwar.com/php/guide-de-conception.html

Ce guide a pour but d’imposer des règles relativement strictes pour essayer de respecter les concepts modernes du développement en PHP.

Toutes les remarques à ce sujet seront les bienvenues !

captcha

FOSUserBundle: un CAPTCHA à l’inscription

2

En travaillant récemment avec Symfony2 et l’excellent FOSUserBundle, j’ai été amené à mettre en place un CAPTCHA à l’inscription.

Possédant mon propre bundle de Captcha (GregwarCaptchaBundle), je vous écrit un article qui vous explique comment faire marcher les deux ensemble.

Le principe est d’écrire votre propre formulaire d’inscription qui surchargera celui de FOS, voici le code :

namespace Something\Bundle\Form;

use Symfony\Component\Form\FormBuilderInterface;
use FOS\UserBundle\Form\Type\RegistrationFormType as BaseType;

class RegistrationType extends BaseType
{
    public function buildForm(FormBuilderInterface $builder,
                                           array $options)
    {
        parent::buildForm($builder, $options);

        $builder->add('captcha', 'captcha', array(
            'label' => 'Code visuel :'
        ));
    }

    public function getName()
    {
        return 'somethingbundle_user_registration';
    }
}

Enregistrez maintenant votre type dans votre configuration en tant que service :

# config.yml

services:
    something.registration.form.type:
        class: Something\BundleForm\RegistrationType
        arguments: [%fos_user.model.user.class%]
        tags:
            - { name: form.type, alias: somethingbundle_user_registration }

Après cela, enregistrez votre formulaire auprès de la configuration de FOSUserBundle pour lui dire qu’il faudra utiliser votre formulaire au lieu du sien :

# config.yml

fos_user:
    registration:
        form:
            type: somethingbundle_user_registration

Voila! Votre inscription contiendra alors un code visuel

Haut de page