Il s'agit d'une bibliothèque PHP permettant de récupérer et de valider les champs et de stocker les messages dans différents conteneurs (y compris les erreurs, les avertissements, les informations et le succès) en fonction des conditions.
L'idéologie derrière cette bibliothèque est simple : 3 classes, une dépendance simple et fonctionne en PHP 7.1 et supérieur, elle peut donc fonctionner dans pratiquement n'importe quel projet PHP, y compris WordPress, Laravel, le projet PHP principal, etc.
Exemples
Formulaire et tableau du didacticiel avec PHP
C'est un exemple de fonctionnalité. Un exemple typique est plus complexe, même s'il ne s'agit que de quelques lignes de code.
Disons que nous voulons valider une valeur d'entrée (get) appelée "id", nous pourrions faire les choses suivantes :
use eftec ValidationOne ;
$ val = new ValidationOne ();
$ r = $ val -> def ( ' ERROR ' )
-> type ( ' integer ' )
-> ifMissingThenDefault ()
-> condition ( " eq " , " It's not equals to 10 " , 10 )
-> condition ( " eq " , " It's not equals to 30 (info) " , 30 , ' info ' )
-> ifFailThenDefault ()
-> get ( ' id ' ); // <-- end of the chain
Mais où est l'erreur ?. Les messages sont stockés dans messageList
var_dump ( $ val -> messageList -> allArray ()); // here we show all messages of any kind of type.
var_dump ( $ val -> messageList -> errorCount ); // returns the number of errors.
var_dump ( $ val -> errorcount ()); // returns the number of errors (alternative)
var_dump ( $ val -> hasError ()); // returns true if there is an error.
Cependant, nous pourrions également afficher un message par type (erreur, avertissement..) et uniquement un message par un identifiant spécifique.
var_dump ( $ val -> messageList -> get ( ' id ' )-> allErrorOrWarning ()); // All error or warning contained in the key "id".
Pourquoi les messages sont stockés dans une certaine structure ?. N'est-il pas facile de simplement renvoyer l'erreur ?
Une réponse est un formulaire. Disons que nous avons un formulaire avec trois champs. Si l'un d'eux échoue, l'erreur doit être visible pour chaque champ séparément. De plus, l'ensemble du formulaire pourrait avoir son propre message.
Le début de la chaîne est généralement écrit à la fin du code.
Les méthodes autorisées sont :
Exemple:
$ val = new ValidationOne ();
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> post ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> request ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> set ( ' 123 ' , ' id ' );
$ val = new ValidationOne ();
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' ); // $_GET['id']
$ val = new ValidationOne ( ' frm ' ); // we set a prefix for every reading.
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' ); // $_GET['frm_id']
condition ($condition, $message = "", $conditionValue = null, $level = 'erreur', $key = null)
Il ajoute une condition selon laquelle cela dépend du type d'entrée.
@param chaîne $condition
nombre :req,eq,ne,gt,lt,gte,lte,entre,null,notnull
chaîne : req,eq,ne,minlen,maxlen,betweenlen,null,notnull,contain,notcontain,alpha,alphanum,text,regexp,email,url,domain
date :req,eq,ne,gt,lt,gte,lte,entre
datestring : req,eq,ne,gt,lt,gte,lte,entre
booléen :req,eq,ne,true,false
fichier : minsize,maxsize,req,image,doc,compression,architecture,ext
fonction:
fn.static.Class.methodstatic
fn.global.fonction
fn.object.Class.method où l'objet est un $object global
fn.class.Class.méthode
fn.class.namespaceClass.method
@param chaîne $message
Le message pourrait utiliser les variables suivantes '%field','%realfield','%value','%comp','%first','%second'
Champ | Description | Exemple |
---|---|---|
%champ | nom du champ, il peut s'agir de l' ID ami ou du nom réel | Numéro client |
%champ réel | nom du champ (pas le Friendid ) | Identifiant client |
%valeur | valeur actuelle du champ | John |
%comp | valeur à comparer (le cas échéant) | |
%d'abord | première valeur à comparer (si la valeur de comparaison est un tableau) | |
%deuxième | deuxième valeur à comparer (si la valeur de comparaison est un tableau) | |
%clé | clé utilisée (pour le tableau d'entrée) |
@param null $conditionValue
@param string $level (erreur, avertissement, info, succès). Le niveau de l'erreur. Voir MessageContainer pour plus d'informations
@param string $key Si la clé n'est pas nulle alors elle est utilisée pour ajouter plus d'une condition par clé
@return ValidationOne
Remarque : si la valeur est nulle et que isNullValid() est vraie, alors les conditions sont ignorées. Si la valeur est manquante et que isMissingValid() est vrai, alors les conditions sont ignorées. Si la valeur est vide ('') et que isEmptyValid() est vrai, alors les conditions sont ignorées. Si la valeur est vide ('') ou nulle et que isNullOrEmptyValid() est vraie, alors les conditions sont ignorées. isNullValid(),isMissingValid(),isNullOrEmptyValid() et isEmptyValid() sont utiles lorsque nous voulons valider une valeur uniquement si elle existe ou si la valeur est définie.
Exemple:
$ validation -> def ( null )
-> type ( ' integer ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 60 )
-> set ( ' aaa ' , ' variable2 ' );
taper | description |
---|---|
entier | (numérique) il permet un nombre sans décimale |
unixtime | (numérique) il permet un nombre sans décimale |
booléen | (booléen) il stocke vrai ou faux. L'entrée peut varier (vide, zéro ou nul = faux, sinon vrai) |
décimal | (numérique) il autorise un nombre avec décimal |
flotter | (numérique) il autorise un nombre avec décimal |
Varchar | (chaîne) il autorise toute entrée |
chaîne | (chaîne) il autorise toute entrée |
date | (date) l'entrée peut être un DateTime ou une chaîne. La valeur est stockée sous forme d'objet DateTime |
dateheure | (date) l'entrée peut être un DateTime ou une chaîne. La valeur est stockée sous forme d'objet DateTime |
chaîne de date | (date) l'entrée peut être un DateTime ou une chaîne. La valeur est stockée sous forme de chaîne |
datetimestring | (date) l'entrée peut être un DateTime ou une chaîne. La valeur est stockée sous forme de chaîne |
déposer | (fichier) l'entrée est une chaîne, et elle est stockée sous forme de chaîne, mais elle ajoute une validation spéciale |
Type d'entrée | Condition | |
---|---|---|
nombre | gt,lt,gte,lte,entre | |
chaîne | minlen,maxlen,entrelen,contenir ,ne contient pas,alpha,alphanum,texte,expression régulière,email,url,domaine | |
date | gt,lt,gte,lte,entre | |
chaîne de date | gt,lt,gte,lte,entre | |
booléen | vrai, faux | |
déposer | taille min, taille max, req, image, doc, compression, architecture, ext | |
* (cela s'applique à tout type) | req,eq,ne,null,notnull,vide,nonvide | |
* | fonction | |
* | fn.static.Class.methodstatic | |
* | fn.global.fonction | |
* | fn.object.Class.method où l'objet est un $object global | |
* | fn.class.Class.méthode | |
* | fn.class.namespaceClass.method |
Condition | Description | Exemple de valeur |
---|---|---|
architecture | L'extension du fichier doit être un fichier d'architecture (dwg, etc.) | |
entre | Le nombre doit être compris entre deux valeurs | [0,20] |
entrelen | La longueur du texte doit être comprise entre deux valeurs | [0,20] |
compression | L'extension du fichier doit être un fichier de compression | |
contenir | Le texte doit contenir une valeur | "texte" |
doc | L'extension du fichier doit être un fichier de document | |
eq (cela pourrait être un tableau ou une valeur) / == | La valeur doit être égale à La valeur doit être contenue dans un tableau | "texte",["texte","texte2"] |
exister | Le fichier ou la valeur doit exister (il peut être nul/vide) | |
manquant / n'existe pas | Le fichier ou la valeur ne doit pas exister ou être nul/vide | |
requis (ou req) | La valeur ne doit pas être nulle ou vide | |
poste | L'extension (fichier) doit être dans la liste des extensions | ["ext1", "ext2", "ext3"] |
FAUX | La valeur doit être fausse (===faux) | |
fn.class.namespaceClass.method | La méthode d'une classe doit retourner vrai | |
fn.class.Class.méthode | La méthode d'une classe doit retourner vrai | |
fn.global.fonction | La fonction globale doit retourner vrai | |
fn.object.Class.method où l'objet est un $object global | La méthode d'un objet global doit retourner vrai | |
fn.static.Class.methodstatic | La méthode statique d'une classe doit retourner vrai | |
fonction | La fonction doit retourner vrai | |
gt /> | La valeur doit être supérieure à | 123 |
gîte / >= | La valeur doit être supérieure ou égale à | 123 |
image | L'extension du fichier doit être un fichier image | |
lt / < | La valeur doit être inférieure à | 123 |
lte / <= | La valeur doit être inférieure ou égale à | 123 |
maxlen | La longueur maximale d'une chaîne | 123 |
taille maximale | La taille maximale d'un fichier | 123 |
Minlen | La longueur minimale d'une chaîne | 123 |
taille réduite | La taille minimale d'un fichier | 123 |
mime (la valeur à comparer peut être une chaîne ou un tableau) | Le type MIME d'un fichier | "application/msword" ou ["application/msword","image/gif"] |
type MIME | Le type MIME (sans sous-type) d'un fichier | "application" ou ["application,"image"] |
ne / != (la valeur à comparer peut être une valeur unique ou un tableau) | La valeur ne doit pas être égale. Ou la valeur ne doit pas être contenue dans un tableau | 123,[123,345],["aa","bb"] |
ne contient pas | La valeur ne doit pas contenir de valeur | "texte" |
pas nul | La valeur ne doit pas être nulle | |
nul | La valeur doit être nulle | |
vide | La valeur doit être vide (c'est-à-dire "",0,null) | |
pas vide | La valeur ne doit pas être vide (c'est-à-dire non égale à "",0,null) | |
demande | La valeur doit exister | |
vrai | La valeur doit être vraie (===true) |
Exemples :
$ validation -> def ( null )
-> type ( ' integer ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' between ' , ' %field %value must be between 1 and 50 ' ,[ 1 , 50 ])
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 60 )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' ,[ 60 , 200 ]) // eq allows a single or array
-> condition ( ' fn.static.Example.customval ' , ' the function does not work ' )
-> condition ( ' req ' )
-> condition ( ' lt ' , " es muy grande " , 2000 , ' warning ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' fn.static.Example.fnstatic ' , ' the static function does not work ' )
-> condition ( ' fn.static.somespaceSomeclass.methodStatic ' , null )
-> condition ( ' fn.global.customval ' , ' The global function does not work ' )
-> condition ( ' fn.object.example.fnnostatic ' , ' the function object does not work ' )
-> condition ( ' fn.class.somespaceSomeclass.method ' , ' The function some class does not work ' )
-> condition ( ' fn.class.Example.fnnostatic ' , ' la funcion class no funciona ' );
// ->condition('fn.static.Example.customval','la funcion no funciona')
function customval ( $ value , $ compareValue ) {
return true ;
}
Parfois, nous devons utiliser une condition personnalisée. Nous pourrions créer une variable globale, une fonction statique ou même une méthode dans une classe.
Chaque méthode ou fonction créée doit avoir deux paramètres (avec n'importe quel nom) :
Par exemple, que se passe-t-il si nous devons évaluer si un identifiant n'existe pas dans la base de données ?
$ validation -> condition ( ' fn.global.idExist ' , ' The id already exist! ' )-> get ( " id " );
function idExist ( $ id , $ compare = null ) {
// select count(*) c from table where id=$id
if ( $ c > 0 ) {
return true ;
} else {
return false ;
}
}
Remarque : si nous devons spécifier un espace de noms, nous pouvons alors utiliser la notation : namespaceSomeClass
$ validation -> condition ( ' fn.global.customfn ' ); // global
$ validation -> condition ( ' fn.static.SomeClass.staticfn ' ); // calling a static method inside the class SomeClass.
$ validation -> condition ( ' fn.class.SomeClass.noStaticFn ' ); // method inside a class,it creates an instance of an object then it calls the method
$ validation -> condition ( ' fn.object.myObject.noStaticFn ' ); // method inside a class, it uses an instance called $myObject
// global function
function customfn ( $ value , $ compareValue ) {
// returns true or false
}
// static function
$ myObject = new SomeClass ();
class SomeClass {
public static function staticfn ( $ value , $ compareValue ) {
// returns true or false
}
public function noStaticFn ( $ value , $ compareValue ) {
// returns true or false
}
}
Lorsque nous validons un objet, il peut stocker les informations dans le conteneur de messages (également appelé liste de messages).
MessageContainer (EFTEC/MessageContainer) contient une liste de messages de manière hiérarchique :
Container (usually only 1 for all the project)
Lockers (from zero to many)
Messages (from zero to many and grouped by level)
$ container -> get ( ' locker20 ' )-> firstError (); // it returns the first message of error in the locker20 that is part of the container.
Les messages sont échelonnés comme suit
identifiant | Description | Exemple |
---|---|---|
erreur | Le message est une erreur et il doit être résolu. C’est notre clou du spectacle. | La base de données est en panne |
avertissement | Le message est un avertissement qui pourrait peut-être être ignoré. Cependant, la classe MessageContainer permet de regrouper Error et Warning de la même manière. | Le registre a été stocké mais avec des avertissements |
infos | Le message est une information. Par exemple, pour enregistrer ou déboguer une opération. | Le journal est stocké |
succès | Le message est une opération réussie | Commande acceptée |
Fonction | Description | Exemple |
---|---|---|
addMessage($idLocker, $message, $level = 'erreur') | Il ajoute un message à l'intérieur d'un casier. Habituellement, cela est fait automatiquement par la bibliothèque mais vous pouvez ajouter des messages manuellement via du code. | $this->addMessage('pwd','le mot de passe est requis','erreur'); |
getMessage($withWarning = faux) | Il obtient le premier message d'erreur ou vide s'il n'y en a pas | $this->getMessage(); |
getMessages ($ withWarning = false) | Il obtient tous les messages d'erreur ou est vide s'il n'y en a pas | $this->getMessages(); |
getMessageId($idLocker) | Il obtient un objet MessageLocker (voir EFTEC/MessageContainer pour plus d'informations) | $obj=$this->getMessageId('pwd'); |
errorCount (includeWarning = faux) | Il obtient le nombre d'erreurs | $count=$this->errorCount(); |
hasError($includeWarning=false) | Il renvoie vrai s'il y a une erreur | $fail=$this->hasError(); |
Champ | Description | Exemple |
---|---|---|
$liste de messages | Il récupère tout le conteneur. Il renvoie un objet du type MessageContainer | $container=$this->messageList; |
Vous pouvez voir plus d'informations sur MessageContainer dans EFTEC/MessageContainer
Exemple:
$ validation -> addMessage ( ' idlocker ' , ' this field is required ' , ' error ' ); // it adds a message inside a locker.
$ validation -> messageList -> get ( ' idlocker ' )-> allError (); // it gets all errors from the locker idlocker
$ validation -> getMessages ( true ); // it gets all messages of error or warning from all the lockers.
Nous pourrions également travailler avec des dates. Il existe plusieurs types de formats de date.
taper | description |
---|---|
date | (date) l'entrée peut être un DateTime ou une chaîne. La valeur est stockée sous forme d'objet DateTime |
dateheure | (date) l'entrée peut être un DateTime ou une chaîne. La valeur est stockée sous forme d'objet DateTime |
chaîne de date | (date) l'entrée peut être un DateTime ou une chaîne. La valeur est stockée sous forme de chaîne à l'aide du champ $dateOutputString |
datetimestring | (date) l'entrée peut être un DateTime ou une chaîne. La valeur est stockée sous forme de chaîne à l'aide du champ $dateLongOutputString |
Il existe deux manières de spécifier le format des dates : courte (Date uniquement) et longue (date et heure). Et nous pourrions spécifier le format en entrée et en sortie.
Champ de nom | Description | Valeur par défaut |
---|---|---|
$dateCourt | C'est le format d'entrée (attendu) pour la date (courte) | j/m/a |
$dateLong | C'est le format d'entrée (attendu) (avec date et heure) | j/m/YH:i:s |
$dateOutputString | C'est le format de sortie (pour datestring) | Année |
$dateLongOutputString | C'est le format de sortie (pour datetimestring) | YmdTH:i:sZ |
$ r = getVal ()-> type ( ' datestring ' )-> set ( ' 31-12-2019 ' ); // 2019-12-31 note: the default input value is d/m/Y, not m/d/Y
On peut changer le format de la date en changeant les champs ou en appelant les fonctions suivantes
Paramétrage du format des dates (entrée courte, entrée longue, sortie courte et sortie longue)
$ validation -> setDateFormat ( ' m/d/Y ' , ' m/d/Y H:i:s ' , ' Y-m-d ' , ' Y-m-dTH:i:sZ ' )
Nous définissons le format des dates sur la configuration par défaut
$ validation -> setDateFormatDefault ();
Nous définissons le format des dates à :
Nom | Format |
---|---|
entrée courte | m/j/a |
entrée longue | m/j/YH:i:s |
sortie courte | Année |
sortie longue | YmdTH:i:sZ |
$ validation -> setDateFormatEnglish ()
Par défaut, cette bibliothèque ne génère pas d'exceptions. Il est cependant possible de générer des exceptions si le message est de type ERREUR et/ou AVERTISSEMENT.
Avec cette méthode, si le conteneur génère une erreur, alors il est stocké et génère également une nouvelle exception.
Remarque : Par défaut, la plupart des messages sont du type ERREUR.
Remarque : Lorsque l'opérateur est lancé, la valeur n'est pas attribuée et la pile est supprimée, c'est-à-dire que si nous levons une exception, toutes les informations sont perdues.
try {
$ validation -> type ( ' integer ' )
-> throwOnError () // for errors only
-> set ( ' hello ' , ' field1 ' );
// or you could use:
$ validation -> type ( ' integer ' )
-> throwOnError ( true , true ) // for errors and warnings
-> set ( ' hello ' , ' field1 ' );
$ this -> fail ( ' this value means the throw failed ' );
} catch ( Exception $ ex ) {
$ this -> assertEquals ( ' field1 is not numeric ' , $ ex -> getMessage ());
}
Il existe quatre manières différentes de gérer les valeurs vides dans cette bibliothèque.
$ validation -> exist ()-> set ( null ); // is valid.
$ validation -> exist ()-> set ( '' ); // is valid.
$ validation -> exist ()-> get ( ' field ' ); // is valid only if $_GET['field'] exist (even if it is null)
$ validation -> required ()-> set ( null ); // is not valid.
$ validation -> required ()-> set ( "" ); // is not valid.
$ validation -> required ()-> set ( ' hi ' ); // is valid.
$ validation -> notnull ()-> set ( null ); // is not valid.
$ validation -> notnull ()-> set ( "" ); // is valid.
$ validation -> notnull ()-> set ( ' hi ' ); // is valid.
$ validation -> notempty ()-> set ( null ); // is valid.
$ validation -> notempty ()-> set ( "" ); // is not valid.
$ validation -> notempty ()-> set ( ' hi ' ); // is valid.
De plus, il existe 4 façons d'accepter les valeurs manquantes, nulles ou vides, en contournant toute condition.
$ validation -> isNullValid ()-> condition (... . )-> set ( null ); // is valid no matter the condition.
$ validation -> isNullorEmptyValid ()-> condition (... . )-> set ( null ); // is valid no matter the condition.
$ validation -> isEmptyValid ()-> condition (... . )-> set ( '' ); // is valid no matter the condition.
$ validation -> isMissingValid ()-> condition (... . )-> get ( ' field ' ); // If the field is missing, then is valid no matter the condition
Il est utilisé lorsque nous devons valider lorsqu'une entrée a une valeur, sauf si la valeur est manquante, vide ou nulle.
isNullorEmptyValid() est égal à appeler : isEmptyValid()->isNullValid()
De plus, ces opérateurs pourraient être empilés.
$ validation
-> isNullorEmptyValid ()
-> isMissingValid ()
-> condition (... . )
-> set (... . ); // this expression is valid if the value is null, empty(''), the value is missing, no matter the conditions.
Nous pourrions définir une valeur par défaut. Cette valeur peut servir de solution de repli en cas d'erreur. La valeur par défaut n'est jamais convertie ni traitée.
$ validation
-> def (- 1 )
-> type ( ' integer ' )
-> ifFailThenDefault ()
-> set (...); // if the operation fails, then it returns -1
Coupez le résultat. Par défaut, le résultat n'est pas tronqué. Vous pouvez couper le côté gauche, droit ou les deux côtés. Il utilise la méthode convert() pour effectuer l'opération.
$ validation -> trim ()-> set (... . ); // trim both sided
$ validation -> trim ( ' trim ' , ' ., ' )-> set (... . ); // trim . and ,
$ validation -> trim ( ' ltrim ' )-> set (... . ); // trim left sided
$ validation -> trim ( ' rtrim ' )-> set (... . ); // trim right sided
Parfois, nous voulons toujours réduire les résultats. Nous pourrions donc utiliser cette méthode pour toujours découper le résultat. Il se cumule à la fin de la conversion.