formcreator icon indicating copy to clipboard operation
formcreator copied to clipboard

validation de date par rapport à "maintenant" et un décalage

Open EC2311 opened this issue 3 years ago • 9 comments

Y a t-il moyen de forcer qu'une date saisie soit inférieure ou supérieure de 'n' jours à la date du jour ? Comme cela, je n'ai pas vu hormis les regexp d'un champs texte... mais ?

Merci

EC2311 avatar Jan 06 '22 17:01 EC2311

Bonjour

Il n'y a pas de fonctionnalité pour cela. Utiliser des regex peut aider à fixer des bornes, mais je ne vois pas comment utiliser une regex pour faire une borne relative à l'instant présent.

btry avatar Jan 06 '22 18:01 btry

OK Je pensais meme utiliser l'affichage du bouton soumettre que si saisie > date jour... mais apres cela fait entrer trop de possibilité... ou alors il faudrait "imaginer" une requete executable dynamique... un peu complexe

Merci bien

EC2311 avatar Jan 10 '22 12:01 EC2311

Il est possible d'améliorer le système de conditions pour gérer une forme simple d'expression de date. Pourquoi pas basée sur les expressions d'intervalle prises en charge par PHP:

https://www.php.net/manual/fr/dateinterval.createfromdatestring.php https://www.php.net/manual/fr/function.strtotime.php

La complexité de la fonctionnalité me parait très raisonnable.

btry avatar Jan 10 '22 13:01 btry

Ce qui voudrait dire donc que si l'on souhaite tester une date (saisie) avec un délai (>ou<), il faudrait ajouter 2 champs : nbre et unité (Y, M, D ...)

EC2311 avatar Jan 10 '22 13:01 EC2311

Non, On peut utiliser la forme actuelle de conditions. Par exemple on écrirait "-1 day" dans la valeur de la condition, qui serait évalué à l'instant présent - 1 jour. L'instant présent est l'instant où la condition est évaluée. Cela arrive quand on modifie un champ du formulaire mais aussi quand il est soumis.

Si cela vous intéresse, vous pouvez prendre contact pour étudier de manière plus approfondie ce développement.

btry avatar Jan 10 '22 13:01 btry

ok, je vois , en effet. Peut etre connaissez vous le nom de la classe faisant ces tests ? A mon avis cela serait inséré dans ce champs (entouré ) ? image

Je pourrais regarder de mon coté et essayer de proposer quelque chose ?

EC2311 avatar Jan 10 '22 13:01 EC2311

Si vous voulez esssayer de réaliser cela vous devez savoir que la classe PluginFormcreatorCondition représente chaque ligne d'une expression de condition. La valeur est la colonne show_value

Pour les questions type date, datetime et time regardez les respectivement classes DateField DatetimeFieldet et TimeField . Elles sont toutes dans l'epace de nom GlpiPlugin\Formcreator\Field et contiennent des méthodes pour les comparaisons avec une valeur fournie en argument : equals() et lessThan(). A patir deces méthodes, les autres formes d'inégalités sont déduites automatiquement, il ne doit pas avoir besoin de les modifier.

Le développement devrait avoir lieu à partir de la branche develop pour une éventuelle inclusion en 2.13.0

btry avatar Jan 10 '22 13:01 btry

Je suis désolé, j'ai regardé, j'ai bien trouvé pour la saisie en ligne 404 de inc\condition.class.php -> show_value, mais je ne vois pas comment et ou ajouter les tests :( : je ne connais pas suffisamment php

EC2311 avatar Jan 10 '22 15:01 EC2311

Pour une implémentation dans une question type datetime, je pense que l'intégralité du code doit être dans les méthodes equals() et greaterThan() (j'ai dit lessThan() tout à l'heure, c'était une erreur).

Il faut créer une méthode protégée qui prend une valeur type chaine et qui détermine si c'est une date ou un expression. Je pense que tenter de convertir la valeur avec DateTime::createFromFormat. ou son constructeur. Ca mérite un peu de réflexion pour trancher. La méthode retourne quelque chose qui dit si c'est une date ou un expression.

Dans equals() et greaterThan() il faut appeler cette nouvelle méthode pour ensuite opérer une comparaison selon 2 algorithmes différents : l'un traitant une simple date, l'autre traitant un intervalle.

btry avatar Jan 10 '22 15:01 btry