Web

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

symfony

Manipulation d’images sous Symfony2

0

Dans un article précédent, je montrais une bibliothèque permettant de manipuler des images d’une manière un peu particulière, mais à mon sens intéréssant. Ici, nous allons parler de la façon dont cette bibliothèque peut s’intégrer à Symfony2.

Je travaille actuellement sous Symfony2 et j’ai été amené à manipuler des images dans une application que je développe. Ayant déjà sous la main ma propre classe de gestion d’images, j’ai décidé de l’intégrer au framework à l’aide d’un Bundle. Comme vous pourrez le remarquer si vous jetez un oeil au projet git correspondant, l’intégration de la classe dans un bundle Symfony2 ne nécéssite pas beaucoup de code supplémentaire.

Installation

Commencez par placer le dépôt git dans vos dépendances et clonez-le. Ajoutez alors l’espace de nom Gregwar à votre app/autoloader.php :

'Gregwar' => __DIR__.'/../vendor/gregwar-image/bundle/',

Une fois fait, ajouter le bundle à votre app/AppKernel.php :

...
public function registerBundles()
{
$bundles = array(
...
new Gregwar\ImageBundle\GregwarImageBundle(),
...
);
...

Il ne vous reste plus qu’à ajouter à votre fichier de configuration (ex: app/config/config.yml) :

gregwar_image: ~

Puis, créez le dossier web/cache et donnez les permissions à apache d’écrire dedans

mkdir web/cache
chmod 777 web/cache

Si vous voulez utiliser un autre nom, précisez le dans la configuration:

gregwar_image:
   cache_dir: mes_fichies_caches

Services fournis

Ce Bundle Symfony2 vous fournit principalement deux choses:

  1. Un service image.handling permettant d’utiliser la classe Gregwar\Image avec l’injection de dépendance;
  2. Un helper twig, qui vous permet d’utiliser les fonctionnalités de Gregwar\Image directement dans vos templates

Je ne m’attarderais pas sur le premier point, vous l’aurez vite compris, vous pouvez écrire des lignes de la forme:

$this->get('image.handling')->open('linux.jpg')
    ->grayscale()
    ->rotate(12)
    ->save('out.jpg')

Dans vos contrôleurs ou dans n’importe quel classe ayant accès aux services, ce qui peut s’avérer pratique !

La partie intéréssante repose sur l’helper Twig, qui peut être très utile en tirant profit du dossier de cache. Le bundle enregistre la fonction twig image() qui fournit la même API qu’avec la classe Gregwar\Image. Un exemple:

<!-- template.html.twig -->

<img src="{{ image('linux.png').resize('30%').rotate(-12).jpeg }}" />

Le résultat sera alors l’adresse du fichier de cache hashé. Petit bonus: cet helper fait lui-même appel à l’helper asset() pour le chemin du fichier de cache.

Vous pouvez également profiter de l’API de la classe image:

linux.png a une largeur de {{ image('linux.png').width }} px

Dépôt Gregwar/ImageBundle sur Github

Haut de page