Formidable est une bibliothèque PHP pour gérer les formulaires. Il analyse un formulaire HTML et vous permet de le manipuler à partir de votre code PHP, puis de le rendre.
Via le compositeur:
{
"require" : {
"gregwar/formidable" : " dev-master "
}
}Ou avec un clone du référentiel:
git clone https://github.com/Gregwar/Formidable.gitOu le télécharger:
Tout d'abord, vous devez écrire votre code dans HTML, par exemple:
<!-- forms/example.html -->
< form method =" post " >
Enter your name:
< input type =" text " name =" name " /> < br />
< input type =" submit " />
</ form >Dans votre code PHP, donnez votre formulaire à formidable:
<?php
session_start ();
include ( ' vendor/autoload.php ' );
// Formidable will parse the form and use it to check integrity
// on the server-side
$ form = new Gregwar Formidable Form ( ' forms/example.html ' );
$ form -> handle ( function () {
echo " Form OK! " ;
}, function ( $ errors ) {
echo " Errors: <br/> " ;
foreach ( $ errors as $ error ) {
echo " $ error <br /> " ;
}
});
echo $ form ;Simple, non?
Vous pouvez ensuite utiliser la formidable API pour jouer avec votre formulaire:
<?php
// Will set the value of the field
$ form -> name = " Bob " ;
// Will get the value of the field
$ name = $ form -> name ;
// Adds a constraint on the name
$ form -> addConstraint ( ' name ' , function ( $ value ) {
if ( strlen ( $ value ) < 10 ) {
return ' Your name should be at least 10 characters! ' ;
}
});
// Adds a constraint on the whole form
$ form -> addConstraint ( function ( $ form ) {
if ( $ form -> getValue ( ' pass1 ' ) != $ form -> getValue ( ' pass2 ' )) {
return ' The passwords are different ' ;
}
});Vous pouvez également essayer de modifier votre formulaire et d'ajouter une contrainte directement dans le code HTML:
< input type =" text " name =" name " minlength =" 10 " />Cela obligera le texte à compter au moins 10 caractères lorsque les contraintes côté serveur seront vérifiées.
Vous voulez un captcha pour sécuriser votre formulaire?
< input type =" captcha " name =" code " />Cela générera une image et un champ de saisie sur le côté client, et utilise la session sur le côté du serveur pour vérifier que le code est correct.
Notez que cela utilisera la dépendance avec la bibliothèque Gregwar / CAPTCHA (vous devrez installer des dépendances à l'aide de Composer).
Les types d'entrée suivants sont pris en charge:
input , avec types:textnumber ou numeric , voir les attributs min et maxint ou integer , voir les attributs min et maxfilecheckboxradiohiddenpasswordcaptcha , générera automatiquement une imagedate , générera trois sélections et renverra une DateTime sous forme de donnéesmultiradio et multicheckbox (voir la section source)textareaselect Notez que certains attributs ne sont pas HTML-Valid, comme maxlength :
< input type =" text " name =" name " maxlength =" 10 " />Il ne sera pas rendu dans le formulaire HTML, mais sera utilisé pour vérifier l'intégrité.
Voici la liste des attributs disponibles:
minlength : la longueur minimale de la valeurmaxlength : la longueur maximale de la valeurregex : le regexp que la valeur doit respectermin (pour les nombres): la valeur minimalemax (pour les nombres): la valeur maximalerequired : Dites que le champ est requisreadonly : le champ est en lecture et ne doit pas être modificateurvalue : la valeur par défaut du champmin-entries : spécifiez le nombre minimum d'entrées que vous devez fournir pour un multiple (voir ci-dessous)max-entries : Spécifiez le nombre maximum d'entrées que vous pouvez fournir pour un multiple (voir ci-dessous)entries : spécifiez le nombre minimum et maximum d'entrées pour un multiple (voir ci-dessous) Vous pouvez appeler cette méthode sur votre objet $form :
posted() : Retour True si le formulaire a été publiécheck() : Vérifiez le formulaire et renvoyez un tableau d'erreurs de validitéhandle($callback, $errorCallback) , cet appel de méthode de raccourci affichée et chèque (), et appellera $callback si le formulaire est valide, $errorCallback autresetAttribute($field, $attr, $value) : définit un attribut supplémentaire sur un champgetAttribute($field, $attr) : obtient un attribut supplémentaire sur un champsource($source, $values) : Fourniture une source (voir la section "Source")setPlaceholder($name, $value) : Définit une valeur d'espace réservé (voir ci-dessous)addConstraint($field, $callback) : ajoute une contrainte personnalisée sur un champ, le callback sera appelé avec la valeur du champ et doit retourner faux si aucun problème ou une chaîne d'erreur. Si vous y transmettez simplement une fermeture, la fermeture sera appelée avec le formulaire passé comme argument et peut ensuite effectuer des tests impliquant plusieurs champs ou des informations de formulaire.setValue($field, $value) : définissez la valeur d'un champgetValue($field) : obtient la valeur d'un champsetValues(array $values) : définissez les valeurs de certains champsgetValues() : Obtenez les valeurs de tous les champs Un jeton CSRF supplémentaire est automatiquement inséré dans le formulaire et vérifié lorsqu'il est soumis. Ainsi, tous vos formulaires seront sécurisés.
La présence et la validité du jeton CSRF sont utilisées pour vérifier qu'un formulaire a été publié lors de l'appel de la méthode posted (elle est utilisée en interne dans handle )
Si vous spécifiez l'attribut name dans le form , le jeton CSRF sera différent pour ce formulaire spécifique, cela permettra de faire la différence de quel formulaire est soumis s'il existe plusieurs formulaires sur la même page.
La langue pour les erreurs peut être définie avec setLanguage() :
<?php
// Will set the language to french for errors
$ form -> setLanguage ( new Gregwar Formidable Language French ); Vérifiez que votre langue est prise en charge dans le répertoire Language , n'hésitez pas à participer!
Vous pouvez utiliser le système d'approvisionnement pour remplir dynamiquement un select , un multiradio ou une multicheckbox :
< input type =" multicheckbox " name =" colours " source =" colours " /> Ensuite, remplissez-le source :
<?php
$ form -> source ( ' colours ' , array ( ' red ' , ' yellow ' , ' blue ' ));Cela sera rendu par certaines cases à cocher.
Vous pouvez le faire de cette façon avec select :
< select name =" colour " >
< options source =" colours " />
< option value =" other " > Other </ option >
</ select >Puis le proposer avec la même méthode
Vous pouvez créer un formulaire à partir d'un fichier ou à partir d'une chaîne, cela sera détecté automatiquement:
<?php
$ form = new Gregwar Formidable Form ( ' <form method="post">
<select name="colour">
<option value="blue">Blue</option>
<option selected value="red">Red</option>
<option value="green">Green</option>
</select>
</form> ' );
echo $ form -> getValue ( ' colour ' ) . "n" ;
// red
// Sets the color to blue
$ form -> setValue ( ' colour ' , ' blue ' );
echo $ form ;
/* Will display:
<form method="post">
<select name="colour" >
<option selected="selected" value="blue">Blue</option>
<option value="red">Red</option>
<option value="green">Green</option>
</select>
<input type="hidden" name="posted_token" value="d293dc38017381b6086ff1a856c1e8fe43738c60" />
</form>
*/ Vous pouvez également utiliser l'attribut mapping pour remplir votre formulaire ou pour récupérer les données de formulaire dans un tableau ou dans un objet, par exemple:
<?php
class Person
{
protected $ name ;
public function getName () { return $ this -> name ; }
public function setName ( $ name ) {
$ this -> name = $ name ;
}
}
$ person = new Person ;
$ person -> setName ( ' Jack ' );
$ form = new Gregwar Formidable Form ( ' <form method="post">
<input type="text" name="name" mapping="name" />
</form> ' );
$ form -> setData ( $ person );
echo $ form ;
/*
Will output something like:
<form method="post">
<input required="required" type="text" name="name" value="Jack" />
<input type="hidden" name="posted_token" value="aa27f437cc6127c244db14361fd614af51c79aac" />
</form>
*/Notez que le mappage utilise le Symfony PropertyAccessor, vous pouvez ensuite utiliser l'accessoire comme dans l'exemple ci-dessus pour remplir les propriétés.
Vous pouvez utiliser:
getData($entity = array()) : remplit et retourne l'entité avec des données rempliessetData($entity) : remplissez le formulaire avec les attributs d'entité Vous pouvez ajouter plusieurs sous-formulaires à une page à l'aide de la balise <multiple> :
< form method =" post " >
Film name: < input type =" text " name =" film_name " mapping =" name " />
< h2 > Actors </ h2 >
< multiple name =" actors " mapping =" actors " >
First name: < input name =" first_name " mapping =" firstName " /> < br />
Last name: < input name =" last_name " mapping =" lastName " /> < br />
</ multiple >
< input type =" submit " />
</ form > Avec cela, le <multiple> peut être utilisé exactement comme un champ, mais il contient un tableau d'éléments.
Certains JS seront injectés dans la page et vous permettre d'ajouter / supprimer certains éléments.
Vous pouvez utiliser la contrainte min-entries et max-entries pour définir des limites sur le nombre d'entrées dans un multiple.
Si vous spécifiez la même valeur pour min-entries et max-entries , ou spécifiez une valeur pour entries (qui est en fait un alias pour le faire), le nombre d'entrées de RR sera fixe et aucun JavaScript ne sera requis.
Dans certains cas, vous voudrez ajouter des données personnalisées dans le formulaire, il y a deux façons de le faire.
La syntaxe {{ something }} vous permet de simplement injecter des données du code, comme ceci:
<?php
$ form = new Gregwar Formidable Form ( ' <form method="post">
Hello {{ name }}!
</form> ' );
$ form -> setPlaceholder ( ' name ' , ' Bob ' );
echo $ form ; Dans l'exemple ci-dessus, le {{ name }} sera rendu comme Bob .
Notez que les espaces réservés peuvent être utilisés de toute façon exceptés dans les balises <form> et d'entrée:
<?php
$ form = new Gregwar Formidable Form ( ' <form method="post">
<span style="color:{{ color }}">Hello</span>
</form> ' );
$ form -> setPlaceholder ( ' color ' , ' red ' );
echo $ form ;Vous pouvez également écrire votre formulaire à l'aide de PHP, comme un modèle, par exemple:
<form>
<?php echo $ label ; ?> : <input type="text" name="name" />
<input type="submit" />
</form>Et puis instanciez votre formulaire en passant les variables de modèle comme deuxième argument:
<?php
$ form = new Gregwar Formidable Form ( ' the-above-form.php ' , array ( ' label ' => ' Your name ' )); L' $label sera interprétée à l'aide de PHP.
Pour des raisons de performances, vous voudrez peut-être mettre en cache les formulaires analysés.
Pour ce faire, passez simplement true comme le troisième argument du constructeur:
<?php
/**
* Parsed data for the form will be serialized and stored in a cache file,
* if you use this form often, this will offer you better performances.
*/
$ form = new Gregwar Formidable Form ( ' form.html ' , null , true ); Cela utilisera le système Gregwar / Cache, vous devrez obtenir les dépendances du compositeur de ce référentiel ou l'installer manuellement. Par défaut, les fichiers de cache seront écrits dans le répertoire cache d'où le script est exécuté.
Essayez d'exécuter le script performances.php dans les examples/ répertoire, cela vous donnera un exemple de gain de performances avec le cache.
Vous pouvez également transmettre une instance de GregwarCacheCache comme troisième paramètre, qui vous permettra de définir le répertoire de cache.
GregwarFormidable est sous la licence MIT, jetez un œil au fichier LICENSE pour plus d'informations.
V2.0.0 Prise en charge finale pour PHP <5.6
V2.1.0 Supprimer une dépendance dure à la bibliothèque CAPTCHA