Vérifier

Une API générique pour vérifier une valeur.

Introduction

Ce plugin est un outil de dévelopement. Il propose une API basée sur une fonction centrale verifier($valeur, $type, $options) permettant de vérifier qu’une valeur correspond à un critère.

Pour cela, l’API se base sur le même principe d’extension que la fonction autoriser() de SPIP : on peut écrire autant de fonctions qu’on veut, qui définissent un « type » de vérification particulier.

Retours

La fonction retourne une chaîne vide si la vérification se passe bien. Et retourne une chaîne expliquant l’erreur si ce n’est pas concluant.

On peut donc utiliser le retour de cette fonction directement comme information dans la fonction verifier() d’un formulaire CVT.

Montrez moi le code !

// On charge la fonction centrale
$verifier = charger_fonction('verifier', 'inc/');

// On l'utilise
$verifier($valeur, $type_de_test, $options_enventuelles);

// Concrètement
$valeur_test = 50;
$erreur = $verifier($valeur_test, 'entier'); // C'est bon ! $erreur = ""
$erreur = $verifier($valeur_test, 'entier', array('min'=>100)); // C'est pas bon ! $erreur = "Une explication de l'erreur"

Quelles sont les possibilités ?

Vous trouverez la liste des vérifications actuellement disponibles par ici : Références des vérifications.

Ajouter des vérifications

Pour ajouter une vérification, il faut écrire un fichier verifier/truc.php avec dedans une fonction verifier_truc_dist($valeur, $options=array()) et retourner une chaîne vide ou non, comme décrit précédemment.

function verifier_truc_dist($valeur, $options=array()){
	// Je fais des tests et c'est bon
	if ($valeur == 'ok')
		return '';
	// Et si c'est pas bon
	else
		// J'explique pourquoi
		return _T('une_explication');
}

Utilisation auto-magique avec le plugin Saisies

Lorsqu’on décrit une liste de saisies sous forme de tableau normalisé, il est possible de déclarer une vérification à faire pour une saisie. On peut alors passer la liste entière dans la fonction saisies_verifier($saisies) et... magie !

$saisies = array(
	array(
		'saisie' => 'input',
		'options' => array(
			'nom' => 'test',
			'label' => 'Un nombre entre 100 et 500',
			'obligatoire' => 'oui'
		),
		'verifier' => array(
			'type' => 'entier',
			'options' => array(
				'min' => 100,
				'max' => 500
			)
		)
	),
);

include_spip('inc/saisies');
$erreurs = saisies_verifier($saisies); // Et hop pour le verifier() de CVT !

Discussion

9 discussions

  • 3

    Coucou bonjour,
    Peut on faire appel à des vérifications dans les paramètres d’une #SAISIE dans un squelette ?
    Je trouve pas de doc mais ça été fait dans le plugin ICS par exemple : https://git.spip.net/spip-contrib-extensions/import_ics/src/branch/master/formulaires/editer_almanach.html#L19 ... sauf que ça ne semble pas marcher quand j’essaie avec :

    [(#SAISIE{input,numero,
      label=Numéro,
      verifier=#ARRAY{type,entier}
    })]

    dans un formulaire de configuration défini par son HTML seul.

    • Nope, ça n’a aucun sens, puisque #SAISIE c’est juste un #INCLURE, un squelette HTML. Alors que verifier c’est du PHP.

      La doc (ici ou sur Saisies) explique bien : c’est dans une description en tableau PHP.

    • Ah Ok du coup j’ai créé un ticket pour ics.
      Mais les #SAISIES sont bien associées à du php quelque part puisque ça s’enregistre en config. S’il y a un traiter() automagique, ne pourrait il pas y avoir un verifier() ?

    • Non, pas du tout, les #SAISIE ne sont associés à aucun PHP. Ça génère des champs « name=truc » en HTML, et ensuite c’est l’API « CVT Configurer » du core qui lit ça, et qui enregistre les valeurs en meta, sans aucun rapport avec Saisies. Ce qu’il lit c’est juste les « name=truc » finaux.

    Répondre à ce message

  • 2

    Est-ce possible de faire deux vérifications successives, en utilisation auto-magique avec le plugin Saisies (une liste de saisies sous forme de tableau normalisé), pour une même saisie ?

    $saisies = array(
    	array(
    		'saisie' => 'input',
    		'options' => array(
    			'nom' => 'test',
    			'label' => 'Un nombre pair entre 100 et 500',
    			'obligatoire' => 'oui'
    		),
    		'verifier' => array(
    			'type' => 'entier',
    			'options' => array(
    				'min' => 100,
    				'max' => 500
    			)
    		)
    		'verifier' => array(
    			'type' => 'nombre_pair', // vérification créée pour le plaisir
    			'options' => array(
    				'suggestion' => 'superieure',
    			)
    		)
    	),
    );

    Il semble que la succession de ces déclarations rendent inopérantes toutes les vérifications.

    La solution que je vois serait de créer une vérification (en fonction) qui vérifie l’ensemble des vérifications souhaitées, mais avant de le faire, je souhaite m’assurer que l’on ne puisse pas simplement déclarer successivement une liste de vérification sous forme de tableau normalisé.

    Merci par avance pour votre aide.

    • Non, il n’y a pas de mecanisme pour permettre plusieurs verifications. Avec ta syntaxe là seule la dernière verification sera effectuée, car c’est la seule qui restera dans le tableau.

      1. Effectivement je conseille de créer une verification qui effectue elle même plusieurs verif
      2. Cela étant on pourrait imaginer d’étendre la syntaxe des verif automagique de saisies, à voir comment cependant (notamment pour ne pas casser le fonctionnement existant)

    • Merci Maïeul pour ta réponse.

    Répondre à ce message

  • 1

    Bonjour,
    J’ai encore un site en php 5.3.3 donc spip 3.1 et j’ai une erreur fatale sur le fichier verifier/telephone.php.

    La « short syntax arrays » est utilisée à 2 endroits dans ce fichier :
    ligne 109 :

    foreach (['fixe', 'mobile', 'all'] as $format_test) {

    à remplacer par

    foreach (array('fixe', 'mobile', 'all') as $format_test) {

    et ligne 135 :

    if (!in_array($what, [$format, 'all']) and preg_match($pattern, $tel)){

    à remplacer par

    if (!in_array($what, array($format, 'all')) and preg_match($pattern, $tel)){

    Merci !

    • corriger sur git, je releaserai ce week-end (histoire de pas releaser tous les jours)

    Répondre à ce message

  • 6

    Il me semble que dans l’exemple de code (« Montrez moi le code ! »), si on fait charger_fonction(), du coup il n’y a pas besoin de include_spip() non ?

    • C’est corrigé merci

    • Salut, je finalise mon mémo Tutoriel : créer des champs extras depuis un plugin mais je me rends compte que la vérification ne marche pas parce que je ne charge pas la fonction centrale.

      Mais je ne vois pas où mettre charger_fonction() ou include_spip() ?

    • Je ne vois pas de quoi tu parles. Si c’est la déclaration dans les saisies, bah c’est pas du tout toi-même qui fait les vérifications, c’est saisie automatiquement, et c’est censé utiliser saisies_verifier non ? Enfin en fait je ne sais pas ce que fait champs extras, mais c’est ce qui utilise les saisies qui lance les vérifications, pas toi, donc bah ya rien à faire.

    • Je dois rater un truc car la vérification ne fonctionne pas.

      Dans http://spip.pastebin.fr/63220 , je peux rentrer n’importe quoi dans mes champs adresse_spotify/adresse_qobuz alors que j’ai une vérification L32 (sur le fieldset contenant les input mais idem si je le mets directement sur les saisies input).

    • ça n’existe pas une vérification sur une fieldset, ça ne veut rien dire :)

    • Ah ok, je me disais que ça s’appliquait sur les champs à l’intérieur :)

      Effectivement, c’est bon sur la saisie input ! Pourtant, j’avais essayé ça aussi, mais pas comme il faut sans doute :/

      Merci en tout cas.

    Répondre à ce message

  • 2

    Je tente d’utiliser directement cette fonction dans la fonction verifier() d’un formulaire CVT.

    Mon code est le suivant :

    function formulaires_calculer_tva_intra_verifier_dist (){
    	$erreurs = array();
    	$verifier = charger_fonction('verifier', 'inc/');
    	$erreurs = $verifier(_request('siren'), 'siren_siret', 'siren');
    	return $erreurs;
    }

    et j’obtiens un « Warning : Illegal string offset ’message_erreur’ in (...) /ecrire/public/aiguiller.php on line 229 ».

    Je ne parviens pas à trouver ce que j’ai loupé. Il va sans dire que je suis un débutant en php.

    • C’est dans la doc de CVT :)
      La fonction verifier retourne un *tableau* des erreurs indexé par le nom de chaque champ (’champtruc’ => ’erreur1’, etc), et là tu lui mets juste l’éventuel message *d’un* champ, une chaine de caractère donc. Tu dois mettre l’erreur dans $erreurs[’nomduchamp’].

    • Merci pour cette réponse ultra-rapide :-)

    Répondre à ce message

  • 3
    Francois Deplaine

    Bonjour

    Il y a une chose qui bloque pour la création du projet : c’est l’utilisation des champs date

    Date de démarrage
    30/12/2013
    Le format de la date n’est pas accepté.
    Date de démarrage du projet
    Afficher le calendrier

    Date livraison prévue
    31/01/2014
    Le format de la date n’est pas accepté.
    Date à laquelle le projet doit être livré
    Afficher le calendrier

    Date livraison effective
    28/02/2014
    Le format de la date n’est pas accepté.
    Date de livraison effective du projet
    Afficher le calendrier

    Que l’on rentre les différentes dates, de façon manuelle, ou avec les deux calendriers, il affiche l’erreur ci-dessus

    Cordialement,

    • Bonjour,

      J’ai le meme type de souci avec une « erreur technique »,
      « fabriquée » parce l’API editer_objet_traiter relit le résultat ecrit,
      et compare avec la chaine d’origine (ce qui pose problème sur certains formats de date).

      La solution serait d’utiliser l’option « normaliser » de la verification de date,
      mais je n’ai aps encore eu de succes..

      Bloavez mad
      YannX

    • Bonjour,

      Il semble que le commit http://zone.spip.org/trac/spip-zone/changeset/78658/_plugins_/verifier ait introduit ce bug sur la création des dates.

      On a le soucis dans le cas de projet, mais aussi le plugin inscription 3 (date de naissance).

      A la lecture du commit, on pourrait tester ceci ici http://zone.spip.org/trac/spip-zone/browser/_plugins_/verifier/verifier/date.php#L108 :

      if (!$valeur or (is_array($valeur) and !$valeur['date'] and !$valeur['heure'])) {
      return $defaut;
      }

      Code sorti brut de décoffrage. Je n’ai pas ce qu’il faut sous la min pour tester ceci.

    • Francois Deplaine

      Bonjour,

      J’ai fait la modification. Cela n’a rien changé.

      Sur la page ajout de projet il semble y avoir un souci avec la taille des inputs. C’est surement pour cela que cela renvoi une erreur

      Avec la flèche qui ouvre un petit calendrier, si j’entre par exemple les dates suivantes pour les trois onglets

      Date de démarrage
      Date de démarrage du projet
      j’ai ceci affiché avant :
      jj/mm/aaaa
      Avec le calendrier, je clique sur la date du 9 janvier 09/01/2014
      A l’écran le calendrier retourne ceci dans la fenêtre input : 9/01/2014

      Date livraison prévue
      Date à laquelle le projet doit être livré
      j’ai ceci affiché avant :
      jj/mm/aaaa
      Avec le calendrier, je clique sur la date du 24 janvier 24/01/2014
      A l’écran le calendrier retourne ceci dans la fenêtre input : 4/01/2014

      Date livraison effective
      Date de livraison effective du projet
      j’ai ceci affiché avant :
      jj/mm/aaaa
      Avec le calendrier, je clique sur la date du 4 février 04/02/2014
      A l’écran le calendrier retourne ceci dans la fenêtre input : 4/02/2014

      Et cela renvoi cette erreur :
      Le format de la date n’est pas accepté.

    Répondre à ce message

  • Bonjour,
    j utilise ce plugin pour la premiere fois, le concept est chouette !
    Par contre, sur la version 1.0.3 - test, la verif « verifier_telephone_dist » ne peut pas renvoyer autre chose que ’vide’ (cad que le champ est correcte), non ?
    triton

    Répondre à ce message

  • 6

    C’est désespérément le plugin qu’il me faut, mais... il n’apparait pas dans la liste des plugins... j’ai vidé le cache, télécharger la dernière version de Vérifier, éliminé tous les autres plugins, installé la dernière version SPIP, mais non, il reste invisible au back-office. Je ne vois plus quoi faire... quelqu’un verrait-il une solution ?

    • heu à quelle endroit n’apparaît il pas ? dans la liste des plugins à récupérer ou dans la liste des plugins a activer ?

    • Dans la « Liste des plugins », qui permet visualiser tous les plugins actifs et inactifs

    • t’a pas vérifié les droits de lectures/écritures ?

    • Non, et j’avoue ne m’être jamais occupé de cette partie là (car enfin, tous les autres plugins apparaissent normalement...) Je suis en local avec Wamp (sous XP), est-ce qu’il y aurait des paramètres à modifier de ce côté ?
      Merci pour le coup de pouce

    • vérifie que c’est bien le même réglage que partout. Chez moi en local pas de pb. Si non, je ne sais pas :(

    • Maïeul, j’ai rebooté, vidé tous les caches, et le plugin est revenu... allez savoir ;-)
      Merci pour l’aide, et pour le plugin !

    Répondre à ce message

  • 2

    Bien que j’adhère en général à la logique de brique/modules sur lesquels les plugins peuvent se brancher (vive les pipelines au passage), et que je comprends qu’on puisse avoir besoin uniquement de la vérification ; je pense que verifier et saisies devraient fusionner pour fournir une API unique dédiée aux formulaires pour les développeurs.
    Au passage, cela permettra de fournir nativement (de base) les nouveaux champs HTML5 (qui seront souvent des Input classiques avec du JS côté client pour assister l’utilisateur et une vérification automatique par SPIP/l’API en se basant sur le type : d’un côté on dégrade bien avec les anciens navigateurs et garde quand même le contrôle quand JS est désactivé) : entier, montant, date, email et url aussi je crois, etc. Et de la même façon on pourra créer des champs plus riches aussi... (siren_siret, numero, numero_fr, numero_uk, cp_fr, cp_uk, etc.)

    • Vérifier est une API de vérification de valeurs. Ça peut être pour des formulaires mais pas forcément. On peut vouloir vérifier des choses venant d’un autre site ou venant d’une API (genre Atompub ou XML/RPC).

    • Ah ok.. J’avais pas pensé à ce cas (très pertinent RPC) : le contexte CVT a masqué ma vision des choses.

      Mais par rapport à mon idée initiale, il faudra voir les statistiques d’utilisation de saisie seule et saisie+verifier (si ce dernier cas est courant, saisie pourrait carrément nécessiter verfier et on reste dans la logique que je préconise tout en offrant une fonctionnalité indépendante pour d’autres usages...)

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom