BreezingForms modifier un select via des champs en BO

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [RÉGLÉ] BreezingForms modifier un select via des champs en BO

    Bonjour,
    Sur J!5 j'ai créé un formulaire d'adhésion pour une asso avec BreezingForms et les excellents tutos d'Eddy. En front, l'utilisateur qui remplit son bulletin d'adhésion choisit sa licence dans un select :
    1;IRA 20€;20
    0;IMPN 50€;50
    0;FRA 80€;80
    0;FMPN 100€;100
    Derrière, il y a un script d'action sur ce champ pour récupérer le montant de la licence choisie et l'entrer dans un calcul de montant total avec d'autres champs à cocher ou pas. Et pour afficher ou non un panneau : si le select contient 20 ou 50, on n'affiche pas le panneau. S'il contient 80 ou 100, on affiche le panneau.
    Ca fonctionne très bien.
    Mais pour le responsable de l'asso, c'est un peu compliqué pour aller modifier le formulaire quand le tarif des licences change.
    Donc je pensais créer 4 champs texte (qui seraient cachés en front) dans lesquels il irait mettre les montants (dans l'édition du formulaire en BO), ce qui mettrait à jour le select avant de l'afficher en front.
    J'ai créé une fonction en js que j'ai mise dans le script d'initialisation du formulaire, ça ne marche pas. Que ce soit à l'intérieur de la function_bulletin_init (qui contient déjà une fonction pour des calculs de dates) ou juste après.
    Dans le script d'initialisation du champ select, ça ne marche pas non plus. Je veux dire par là, pas d'erreur dans la console, mais le select n'est pas modifié.
    Peut-être que ce n'est pas réalisable ? Ou je ne procède pas de la bonne façon ?
    Voici la dernière mouture du code que j'avais mis dans le script d'initiation du form
    Code:
    function updateSelectOptions() {
        // Récupérer les valeurs des champs texte
        var ira = ff_getElementByName('ira').value;
        var impn = ff_getElementByName('IMPN').value;
        var fra = ff_getElementByName('FRA').value;
        var fmpn = ff_getElementByName('FMPN').value;
        var affil = ff_getElementByName('dejaaffilie').value;
    
        console.log("Valeurs récupérées :");
            console.log("IRA:", ira);
            console.log("IMPN:", impn);
            console.log("FRA:", fra);
            console.log("FMPN:", fmpn);
            console.log("Déjà affilié:", affil);
    if (ira && impn && fra && fmpn && affil) {
            ira = ira.value;
            impn = impn.value;
            fra = fra.value;
            fmpn = fmpn.value;
            affil = affil.value;
      }
    
        // Récupérer le champ select
        var select = ff_getElementByName('licence')[0];
    
        // Vider les options existantes avant de les mettre à jour
        select.innerHTML = "";
    
        // Ajouter les nouvelles options
        if (ira !== '') {
            select.options.add(new Option('IRA ' + ira, ira));
        }
        if (impn !== '') {
            select.options.add(new Option('IMPN ' + impn, impn));
        }
        if (fra !== '') {
            select.options.add(new Option('FRA ' + fra, fra));
        }
        if (fmpn !== '') {
            select.options.add(new Option('FMPN ' + fmpn, fmpn));
        }
        if (affil !== '') {
            select.options.add(new Option('Déjà affilié ' + affil, affil));
        }
    }​
    C'est vraiment dommage que ce composant ne soit plus suivi. Il est incroyable. Je n'ai jamais vu de composant aussi puissant quel que soit le CMS.
    Bref, si quelqu'un a des pistes, ce serait génial. Si c'est chose impossible à faire ... tant pis
    Dernière édition par louisseize à 29/03/2025, 18h47

  • #2
    Bonjour,

    j'imagine que Louisseize est la personne à qui je pense et qui m'a contacté par E-Mail pour ce problème.

    Je pense que la solution la plus simple est de créer un formulaire alternatif qui mettrait les tarifs des Licences à jour.

    Il faut alors insérer un script dans une pièce du formulaire initial pour récupérer les valeurs des tarifs de licences depuis la BDD et en remplir la Select list.
    La solution a été fournie ce matin en réponse à l'E-Mail reçu.

    Je la pose ici au cas où ça pourrait en intéresser plus d'un(e).

    Mise en œuvre.

    Construisez un formulaire avec autant de champs de texte que de licences disponibles, mon exemple en contient 4. Il doit être paramétré pour ne pas être relié à la base de données, les valeurs seront enregistrées et mises à jour par une pièce (PHP).

    Ce formulaire sera à valider pour mettre à jour vos tarifs de licences.

    Dans "Envoyer des pièces -> début de soumission" saisir le code suivant :

    Code:
    $this->execPieceByName('ff_InitLib'); // Inclure la bibliothèque BreezingForms
    // Récupérer les valeurs soumises
    $licence1 = ff_getSubmit('licence1'); // licence1, licence2 etc. sont les noms des champs. À adamter à votre situation.
    $licence2 = ff_getSubmit('licence2');
    $licence3 = ff_getSubmit('licence3');
    $licence4 = ff_getSubmit('licence4');
    $db = JFactory::getDBO(); // Connexion à la base de données
    // IMPORTANT : Les nombres suivants 4645 à 4648 sont les ID des champs que vous devez remplacer par les vôtres, vous les trouvez dans le code source du formulaire.
    $elements = [
    4645 => ['title' => 'Licence 1', 'name' => 'licence1', 'value' => $licence1],
    4646 => ['title' => 'Licence 2', 'name' => 'licence2', 'value' => $licence2],
    4647 => ['title' => 'Licence 3', 'name' => 'licence3', 'value' => $licence3],
    4648 => ['title' => 'Licence 4', 'name' => 'licence4', 'value' => $licence4]
    ];
    foreach ($elements as $element_id => $data) {
    // Vérifier si l'élément existe déjà dans la base
    $query = "SELECT id FROM #__facileforms_subrecords WHERE element = " . (int)$element_id . " LIMIT 1";
    $db->setQuery($query);
    $existing_id = $db->loadResult();
    if ($existing_id) {
    // L'élément existe, on met à jour
    $query = "
    UPDATE #__facileforms_subrecords
    SET value = " . $db->quote($data['value']) . "
    WHERE element = " . (int)$element_id;
    } else {
    // L'élément n'existe pas, on insère
    $query = "
    INSERT INTO #__facileforms_subrecords (record, element, title, name, type, value)
    VALUES (9999, " . (int)$element_id . ", " . $db->quote($data['title']) . ", " . $db->quote($data['name']) . ", 'Text', " . $db->quote($data['value']) . ")";
    }
    // Exécuter la requête
    $db->setQuery($query);
    $db->execute();
    }




    Dans le second formulaire, où l'intéressé peut choisit sa licence, vous insérerez le script suivant dans "Pièces de formulaire -> avant le formulaire", qui remplira la liste à choix.


    Code:
    $this->execPieceByName('ff_InitLib'); // Inclure la bibliothèque BreezingForms
    $db = JFactory::getDBO(); // Obtenir l'objet base de données
    
    // Exécuter la requête pour récupérer les titres et valeurs des licences
    // Les nombres ci-dessous de 4645 à 4648 sont les ID des champs que vous devez changer par les vôtres, vous les trouvez dans le code source du formulaire.
    $db->setQuery("
        SELECT title, value
          FROM #__facileforms_subrecords
          WHERE element IN (4645, 4646, 4647, 4648)
          ORDER BY element ASC
    ");
    
    $results = $db->loadObjectList(); // Charger les résultats sous forme d'objets
    
    // Initialiser la liste avec l'option par défaut
    $listValue = "1;Faites votre choix;\n";
    
    foreach ($results as $row) {
        if (!empty($row->title) && !empty($row->value)) { // Vérifier que title et value ne sont pas vides
            $listValue .= "0;" . trim($row->title) . " à " . trim($row->value) . "€;" . trim($row->value) . "\n";
        }
    }​
    
    // Fonction pour mettre à jour la liste dans le formulaire
    function ff_setSelectList($name, $value) {
    global $ff_processor;
    for ($r = 0; $r < $ff_processor->rowcount; $r++) {
        $row =& $ff_processor->rows[$r];
        if ($row->name == $name) {
            $row->data2 = $value;
        }
        unset($row);
        }
    }
    
    // Appliquer la mise à jour
    ff_setSelectList('liste1', $listValue); // liste1 étant le nom de la liste à remplir. À remplacer par le nom de votre liste.
    
    // Vérifier la sortie pour débogage
    // echo "<pre>Résultat formaté :\n$listValue</pre>";
     ​

    Vous pouvez voir un aperçu:

    Saisissez de nouvelles valeurs dans les champs de ce formulaire

    https://www.breezingforms.eddy-vh.com/index.php?format=html&option=com_breezingforms&ff_ form=2&ff_page=1


    Voyer les valeurs mises à jour dans le formulaire suivant. Il vous faudra afficher la source et voir les value des options de la liste.

    https://www.breezingforms.eddy-vh.com/index.php?format=html&option=com_breezingforms&ff_ form=1&ff_page=1
    Dernière édition par Eddy.vh à 29/03/2025, 16h16
    louisseize aime ceci.
    Cordialement.
    __
    Eddy !!!
    Tutoriels BreezingForms en Français : https://www.breezingforms.eddy-vh.com/

    Commentaire


    • #3
      Bonjour Eddy, vous pensez bien :-) Un tout grand merci ! C'est tout à fait fonctionnel !
      Comme je voulais afficher le nom de la licence et le montant dans les options, j'ai modifié la ligne qui crée celles-ci
      Code:
      //modif pour afficher les options avec la valeur
      foreach ($results as $row) {
          if (!empty($row->title) && !empty($row->value)) { // Vérifier que title et value ne sont pas vides
              // Format: "0;Titre;Valeur" et afficher "Titre Valeur €" pour l'utilisateur
              $listValue .= "0;" . trim($row->title) . " " . trim($row->value) . "€;" . trim($row->value) . "\n";
          }
      }​
      C'est absolument génial ! Le composant lui-même, bien sûr, mais Eddy grâce auquel on peut faire des miracles !
      Eddy.vh aime ceci.

      Commentaire


      • #4
        Hello C. (Louisseize)
        Merci pour le retour positif et les compliments. Ça motive.
        Cordialement.
        __
        Eddy !!!
        Tutoriels BreezingForms en Français : https://www.breezingforms.eddy-vh.com/

        Commentaire

        Annonce

        Réduire
        Aucune annonce pour le moment.

        Partenaire de l'association

        Réduire

        Hébergeur Web PlanetHoster
        Travaille ...
        X