La saisie calcul

La saisie « calcul » prend automatiquement comme valeur le résultat d’un calcul dépendant des valeurs d’autres saisies.

La présente documentation est valable à partir de la version 1.0,0 du plugin,

Installation

Cette saisie est distribuée sous forme de plugin à part. Il n’y a rien d’autre à régler une fois le plugin installé.

Ce pourquoi la saisie est prévue

La saisie est prévue pour faire des calculs simples. Elle permet par exemple, pour un formulaire d’inscription à un évènement, de calculer le prix total.

Elle n’a pas vocation à remplacer un vrai système de panier / boutique, mais peut venir en complément à un site centré essentiellement sur des formulaires d’inscription.

Fonctionnement

Configuration de la saisie

La saisie prend un paramètre calcul. Ce paramètre peut être configuré lorsqu’on construit un formulaire avec Formidable ou autre plugin de construction de formulaire.

Configuration d’une saisie de calcul avec Formidable

Dans ce paramètre, on indique le calcul à effectuer, en utilisant les éléments suivants :
-  opérateurs mathématiques de base : +-*/ ;
-  puissance (2**4) ;
-  parenthèses () ;
-  nom d’un champ entre @ : par exemple @input_1@ ;
-  ROUND() pour arrondir à l’entier le plus proche ; il est possible de mettre un deuxième argument, séparé du premier par une virgule, pour arrondir à un certain nombre de décimal, par exemple ROUND(3.33, 1) => 3.3 ;
-  nombre entier ou décimal, seul le point peut être accepté [1] ; on fera donc attention à mettre en place un contrôle sur le montant renseigné ;
-  espaces et retour lignes.

Si le calcul contient autre chose que l’un de ces éléments, le calcul sera tout simplement ignoré par sécurité (afin d’éviter la mise en place d’un code javascript arbitraire).

Résultat dans un formulaire

Le plugin intègre un script javascript qui effectue les calculs dès lors qu’un champ de formulaire est modifié (.change() en jQuery).

Utilisation avec afficher_si

Si vous utilisez l’affichage conditionnel des saisies voici comment se comporte la saisie :
-  les calculs sont toujours effectués après l’affichage/masquage des saisies ;
-  si une saisie est masquée, elle est considérée comme valant 0 pour le calcul ;
-  lorsque le calcul est fait, si le résultat a changé, alors les tests d’affichage conditionnel sont ré-exécutés.

Il est donc possible d’avoir une saisie de calcul dont le résultat est conditionné par l’affichage d’une autre saisie et dont le résultat conditionne lui-même l’affichage de la saisie. Attention à ne pas faire des renvois mutuels, sinon votre javascript tournera en rond.

Vérification en PHP

Si nous demandons au formulaire que seules les valeurs autorisées puissent être postée (option globale de configuration de formulaire Formidable), alors on vérifiera que le résultat posté correspond bien au résultat du calcul. Il s’agit d’une sécurité pour éviter que des internautes « fraudent » en modifiant après coup, via l’inspecteur web, le résultat du calcul.

Exemple de démonstration

Le fichier .yaml ci-joint est un exemple de formulaire (inutile) utilisant cette saisie.

On demande dans un premier temps si on veut afficher un champ dizaine et/ou un champ unité. On affiche le résultat de l’addition des dizaine et des unités. Si ce résultat dépasse 50, alors on affiche un commentaire.

Exemple de calcul dans un formulaire

Exemple d’utilisation en cas réel

Dans un formulaire d’inscription à une activité d’astronomie :

  • nous demandons le nombre de nuits passées (select_1) ;
  • en fonction du nombre de nuits passées, nous indiquons, via l’affichage conditionnel, le tarif par personne (dégressif) sous forme de champ input en lecture seul (input_1, input_2 et input_3) ;
  • dans un autre champ nous demandons le nombre de personnes (input_4) ;
  • dans une saisie de type calcul (calcul_1), on affiche le prix total :
    • le calcul est (@input_1@+@input_2@+@input_3@)*@input_4@
    • comme seul un des trois inputs entre parenthèses est affiché en même temps, le résultat correspond toujours au prix effectif pour le nombre de nuits, multiplié par le nombre de personnes ;
  • si le montant dépasse 100, alors nous affichons deux autres champs calculés :
    • les arrhes (calcul_2), correspondant à un tiers du prix, arrondi : ROUND(@calcul_1@/3) ;
    • le solde à verser à la fin : calcul_2 : prix total moins arrhes : @calcul_1@ - @calcul_2@.

Notes

[1On se méfiera toutefois, car les calculs informatiques sur les nombres décimaux peuvent parfois révéler des surprises à cause du changement entre l’écriture décimale et l’écriture binaire.

Discussion

10 discussions

  • Bonjour,

    Un petit retour d’expérience.

    Jusqu’à présent, j’utilisais un « hack » en mettant dans une saisie hidden du javascript pour faire mes calculs.
    Avec un cal faisant un if :

    var total = 0;
    total = parseInt($("input[name=radio_1]:checked").val());
    if (total == 0) {
    	total = 18 * parseInt($("input[name=input_1]").val());
    }
    

    le input_1 étant affiché si et seulement si la valeur sélectionnée dans radio_1 était 0 (objectif : permettre de saisir une quantité libre).

    Avec la saisie calcul, ça se fait en 2 saisies :

    • une saisie @calcul_1@ affichée si @radio_1@==« 0 » et calculant : 18 * @input_1@
    • une 2e saisie @calcul_2@ calculant : @radio_1@ + @calcul_1@

    Si ça peut donner des idées à d’autres...

    Répondre à ce message

  • 6

    Bonjour,

    Est-il possible d’effectuer des calculs de date, tels qu’une différence pour obtenir un nombre de jours, par exemple ?

    Merci.

    • Bonjour,

      non ce n’est pas possible. J’aimerais le faire un jour, mais j’ai mille priorités avant.

      Maïeul

    • Merci Maïeul, pas de soucis, Formidable est déjà un super outil !

    • Bonjour c’est déjà top tout ce qu’on peut faire avec ce plugin, mais effectivement si on pouvait faire des calculs sur les dates comme le suggère EtienneJ, ça serait encore plus top :) si on peut aider dans le développement de cette fonctionnalité...

    • Le code étant libre et disponible sur la zone, n’hésite pas à ouvrir des pull request :)

    • Avec grand plaisir, mais étant novice en programmation, j’arrive à bricoler des trucs mais je ne maitrise pas du tout cette logique de « pull request » pour contribuer à un projet. Mais on n’est peut-être pas au bon endroit pour aborder ce sujet.

    • Je pense que tu pourras trouver aisément des tutoriels t’expliquant comment utiliser git et faire des PR.

      Au pire tu peux le faire depuis l’interface graphique.

    Répondre à ce message

  • Salut,

    j’utilise une saisie calcul pour diviser un montant par un nombre de mensualités (voir le yaml http://spip.pastebin.fr/129167 ).

    Ça fonctionne sauf si le montant est un nombre décimal (ex : 25.50). Dans ce cas, la saisie calcul affiche une erreur « Valeur postée non acceptable. » Voir capture d’écran : https://pic.infini.fr/ifIMHset/lNmATY0z.png
    Si je décoche « Vérifier les valeurs possibles » dans les options globales du formulaire, ça fonctionne.

    De mémoire, comme le résultat de la saisie calcul est utilisée pour générer un lien de paiement avec le plugin Bank, il était conseillé de « Vérifier les valeurs possibles » pour éviter "l’injection" d’un montant.

    Si quelqu’une a une piste, je suis preneur...

    Répondre à ce message

  • 2

    Bonjour à tous, je viens d’avoir un petit problème avec ce plugin. Je fais la somme de deux montants, l’un des montant est un montant libre, renseigné par l’internaute.
    Or, si l’internaute renseigne un chiffre avec une virgule (par exemple 250,00) le plugin renvoie une erreur, parce qu’il ne considère pas 250,00 comme un chiffre.
    Si l’internaute renseigne 250 ça marche. S’il renseigne 250.00 (avec un point pour séparer les décimales) ça marche.
    1. Est-ce que l’on pourrait préciser cette contrainte dans la doc du plugin ? J’avoue que je n’ai pas pensé à mettre des contrôles sur le montant saisi.
    2. J’ai mis un contrôle à la validation du formulaire, demandant que le montant soit un entier, et ça fonctionne.
    Merci !
    Éric LM

    • Certes, dans la doc, on marque que « seul le point peut être accepté ». Donc, d’accord, je n’ai pas fait assez attention à cette question.
      Il n’empêche, on pourrait je pense indiquer de façon plus explicite dans la doc qu’il faut mettre en place un contrôle sur le montant renseigné.

    • Oui effectivement. Décicement faudrait que je retravaille sur le plugin « nombre » pour éviter ce problème, Mais pas le temps actuellement.

    Répondre à ce message

  • 2

    Bonjour,

    Merci pour ce plugin ! Il est parfait pour mes calculs dans un formulaire.

    J’ai un petit souci, je n’arrive pas à ajouter automatiquement un sigle € à la suite d’un calcul.
    Je me demandais si c’était possible et si il existait une formulaire pour l’afficher.

    • Non piour le moment ce n’est pas possible. J’ai un projet de saises « nombre » qui permettrait cela, mais pas eu le temps de m’y pencher depuis 8 mois.

    • tant pis mais merci beaucoup pour le retour !
      je vais suivre ce projet.

    Répondre à ce message

  • 2

    Bonjour,

    Sur ce formulaire : https://www.compagnie-skowies.com/-La-Boutique-des-Marionnettes-60-.html quand on passe au bouton valider, la saisie calcul se vide.

    Résultat : quoi qu’on veuille commander, le total est de 0.

    Une idée ?

    PS :

    • Saisies pour formulaires 3.43.2 - stable
    • autoNumeric 1.0.0 - stable
    • Formidable 4.7.1 - stable
    • Saisie de calcul 2.0.1 - test
    • Saisie Nombre 1.1.0 - test
    • La version 2.0.1 de la saisie calcul, et la saisie nombre qui va avec, ne sont pas encore pleinement dévellopé.

      Il faudrait que tu reprenne la version 1.x.x de calcul, et que tu désactive la saisie nombre (ainsi que le plugin autonumeric).

    • Merci, ça corrige effectivement le problème.

    Répondre à ce message

  • 4

    Bonjour,

    Peut-on faire un calcul avec les sélections effectuées sur des champs de type @radio_x@ et/ou @checkbox_x@ ?

    À savoir : j’ai 3 boutons radios de choix, avec les valeurs 2|Premier choix, 4|Second choix, 7|Dernier choix : comment récupérer la valeur sélectionnée avec @radio_1@ ? Idem avec Sélection multiple.

    Merci pour votre aide,
    françois

    Répondre à ce message

  • 7

    Bonjour,
    Le crayon « configurer » ne donne rien pour les champs « Nombre » et « Résultat d’un calcul » dans les interfaces de « Formidable » et « Champs Extras ».
    En SPIP 3.2.7
    Saisie de calcul 2.0.1
    Saisie de nombre 1.0.0
    Les autres champs de saisie de configuration fonctionnent bien.
    Comme je vois une mise à jour récente de « Saisie de calcul », il y a peut-être un réglage à faire ?
    Cordialement.

    • Je ne suis pas sur de comprendre ce que voulez dire par « ne donne rien » :)

      Cela étant, la saisie nombre a des souci, et j’aurais du dépublier la mise à jour de la saisie calcul. Il faut encore que je réécrive la saisie nombre dans les prochaines semaines.

    • Le petit crayon « déplie » normalement une interface de configuration à onglets : « ne donne rien » veut dire que cette interface n’apparaît pas.
      Je peux patienter pour une nouvelle mise à jour.
      Merci pour votre réponse rapide.

    • Quelles versions avez vous du plugin saisies ? il n’y a aucune raison que cela ne donne rien en fait.

      Vous avez des onglets mais pas les champs précis ? je pourrais avoir une capture d’écran.

      + la liste exacte des plugins

    • Version saisie de calcul : 2.0.1
      Je n’obtiens pas les onglets

    • Je demandais la version du plugins Saisies. Pas saisies calcul.

      Vous avez la fameuse version fantome 4.0.0, qui n’aurai jamais exister et qui est très veille.

      -  Désactiver puis effacer cette saisies
      -  Aller dans la page des depots, puis reinitialiser le depot en effacant/recreéant
      -  Installer ensuite saisies v 3.38.0

      (je suis étonné soit dit en passant que vous ayez pas eu plus tot de bug avec la version fantome de saisies)

    • Un GRAND MERCI !
      Tout fonctionne !
      Aucune idée qu’il pouvait y avoir un version fantôme...

    • oui c’est un peu un tru penible. Mais l’avantage c’est que maintenant c’est connnu et facilement reperable.

    Répondre à ce message

  • 1

    \o/ \o/ \o/ M.E.R.C.I. !

    • Pour info, une v2 vient de sortir. Elle apporte de nouvelles fonctionnalité mais nécessite désormais la saisie « nombre » + casse le chemin javascript (mais a priori on s’en fiche normalement).

    Répondre à ce message

  • 1
    Jmtconseils

    Merci beaucoup pour ce plugin.
    Peut-on avoir le cas suivant :
    Je veux effectuer des calculs sur des champs conditionnels, ayant tous comme réponses possibles par exemple : Oui, Parfois, Non.
    J’affecte un coefficient 4 pour Oui, 2 pour Parfois et 0 pour Non
    Comment écrire alors la formule de calcul, si c’est possible ?
    Merci par avance.

    • Je ne suis pas sur d’avoir compris le besoin. J’ai pas l’impression que nous ayons la même définition de « champ conditionnel ». Pour moi un « champ conditionnel » est un champ qui est affiché dans certaine condition (afficher_si), pour vous c’est un champ qui propose plusieurs choix (type select). Ou bien je me trompe ?

      Mais supposons une saisie de type selection avec les entrées suivantes :

      4|oui
      2|parfois
      0|non

      Alors dans une saisie calcul, le calcul sera le suivant

      @selection_1@ * <coefficient multiplicateur>

      (ou similaire, car je ne capte pas le besoin).

    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