[RESOLU] onchange="this.form.submit()"

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] onchange="this.form.submit()"

Re: onchange="this.form.submit()"

par htitushg » 07 févr. 2022, 19:55

J'avais fait une erreur: ça fonctionne à présent Merci beaucoup
Htitushg

Re: onchange="this.form.submit()"

par htitushg » 07 févr. 2022, 19:45

Merci Ynx
J'ai fait la modif :
$contenu .='<td><select class="shortenedSelect" name="quantite" onchange="document.getElementById(\'bouton_dc_modification_produit_'. $ligne_dcmd['id_commande'] . '\').click()">';
Et:
$contenu .= '<td><input type=submit name="bouton_dc" class="modification" value="modification_produit" id="bouton_dc_modification_produit_'.$ligne_dcmd['id_commande'].'"></td>';
Mais l'évènement clik() du bouton n'apparaît pas: je dois faire une erreur d'orthographe peut-être ?
Cordialement
Htitushg

Re: onchange="this.form.submit()"

par ynx » 07 févr. 2022, 13:18

Bonjour,

Tu crées l'input submit id="bouton_dc_modification_produit" dans une boucle while qui parcours les commandes, tu as donc plusieurs éléments HTML qui possède le même identifiant id="bouton_dc_modification_produit", or un identifiant html doit être unique (sinon comment le navigateur pourrait deviner sur quel bouton il doit cliquer).

Puisque la boucle while parcours les commandes, je suppose donc que l'identifiant de la demande dans $ligne_dcmd['id_commande'] est unique pour chaque commande. On peut alors ajouter ce numéro de commande à l'identifiant html du bouton (et dans le code fonction onchange) :
while ($ligne_dcmd = $resultat2->fetch_assoc())
{
    // [...]
    $contenu .='<td><select class="shortenedSelect" name="quantite" onchange="document.getElementById(\'bouton_dc_modification_produit_' . $ligne_dcmd['id_commande'] . '\').click()">';
    // [...]
    $contenu .= '<td><input type=submit name="bouton_dc" class="modification" value="modification_produit" id="bouton_dc_modification_produit_' . $ligne_dcmd['id_commande'] . '"></td>';
    // [...]
}
Ainsi chaque bouton sumbit a bien un identifiant unique et la fonction onchange de chaque commande devrait cliquer sur le bouton correspondant à la même commande.

Re: onchange="this.form.submit()"

par htitushg » 07 févr. 2022, 11:34

Bonjour,
Quand je retire la commande onchange et que je fie seulement au bouton de modification, la mise à jour se fait normalement. Il semble que la commande : onchange="document.getElementById(\'bouton_dc_modification_produit\').click()" ne fonctionne que sur le premier élément comme je l'ai décrit plus haut.
Quelqu'un a-t-il une explication?
Merci pour votre aide
Htitushg

Re: onchange="this.form.submit()"

par htitushg » 07 févr. 2022, 09:39

Bonjour à tous,
La solution proposée par ynx fonctionne, mais j'ai encore un problème:
le formulaire affiche bien chaque commande avec les produits associés, pour le premier produit de la première commande affichée, je peux modifier la quantité, le changement de quantité provoque l'appui du bouton et met à jour le prix pour cette ligne de produit et ajuste le montant de la commande. Par contre s'il y a une 2ème ligne de produit, aucun changement ne se passe, il en est de même pour toutes les autres commandes et lignes de produit associées: le changement de valeur de la quantité provoque bien quelque chose mais la quantité choisie ne s'afiche qu'un bref instant.
je vous copie le code :

Merci pour votre aide

<?php
require_once("./inc/init.inc.php");

function get_options($select,$produit)
{
//alert('coucou !');
$sql='SELECT stock FROM produit WHERE id_Produit='.$produit;
$list=executeRequete($sql);
$data = $list->fetch_assoc();
$options='';
for($nombre = 1; $nombre <= $data['stock']; $nombre++)
{
//debug($nombre);
if($select==$nombre)
{
$options.='<option value="'.$nombre.'" selected>'.$nombre.'</option>';
} else
{
$options.='<option value="'.$nombre.'" >'.$nombre.'</option>';
}
}
return $options;
}

//--------------------------------- TRAITEMENTS PHP ---------------------------------//
$client = $_SESSION['membre']['id_membre'];
//if(!($_GET['action'])) $_GET['action'] == 'affichage_commande';

//--- SUPPRESSION Commande ---//
if((isset($_POST['bouton_c']) && $_POST['bouton_c'] == "suppression_commande"))
{ //debug($_POST,1);
//debug($_GET);
$resultat = executeRequete("SELECT * FROM commande WHERE id_commande=$_POST[id_commande]");
$commande_a_supprimer = $resultat->fetch_assoc();
$contenu .= '<div class="validation">Suppression de la commande : ' . $_POST['id_membre'] . '</div>';
executeRequete("DELETE FROM details_commande WHERE id_commande=$_POST[id_commande]");
executeRequete("DELETE FROM commande WHERE id_commande=$_POST[id_commande]");
$_GET['action'] = 'affichage_commande';
}

//--- SUPPRESSION produit dans commande ---//
if(isset($_POST['bouton_dc']) && $_POST['bouton_dc'] == "suppression_produit")
{
//debug($_POST,0);
//debug($_GET);
executeRequete("DELETE FROM details_commande WHERE id_details_commande=$_POST[id_details_commande]");

//Vérifier s'il reste des produits dans la commande si non détruire la commande
$sup_produit=executeRequete("SELECT * FROM details_commande WHERE id_commande=$_POST[id_commande]");
if (!$sup_produit->num_rows>0)
{ executeRequete("DELETE FROM commande WHERE id_commande=$_POST[id_commande]");}
else
{
// recalcul du montant de la commande qui comprend plusieurs produits
$montant_f=calculMontant_après_modif_produit($_POST[id_commande]);
$resultat3 = executeRequete("UPDATE `commande` SET montant = $montant_f WHERE id_commande = $_POST[id_commande]");
}
$_GET['action'] = 'affichage_commande';
}
//--- ENREGISTREMENT Commande après modif d'un ou plusieurs produits--//

//--- Modification produit dans commande ---//
if(isset($_POST['bouton_dc']) && $_POST['bouton_dc'] == "modification_produit")
//if($_POST['bouton_dc'] == "modification_produit")
{
//if ($_POST['id_details_commande']=='81'){ debug($_POST);}
$id_dcmd=$_POST['id_details_commande'];
$q_dcmd=$_POST['quantite'];
$id_cmd=$_POST['id_commande'];
$pu_dcmd=$_POST['prix_unitaire'];
//recalculer le prix de cette ligne de produit prix= (quantité * prix unitaire)
$Prix=$q_dcmd*$pu_dcmd;
$_POST['prix']=$Prix;
$resultat3= executeRequete("UPDATE details_commande SET quantite = $q_dcmd,
prix=$Prix
WHERE id_details_commande = $id_dcmd");

// Mettre à jour la commande en totalisant les prix des différents produits
// recalcul du montant de la commande qui comprend plusieurs produits
$montant_f=calculMontant_après_modif_produit($id_cmd);
$resultat3 = executeRequete("UPDATE `commande` SET montant = $montant_f WHERE id_commande = $id_cmd");
//alert('Je suis dans modification produit');
$_GET['action'] = 'affichage_commande';
}
//--- ENREGISTREMENT Commande ---//

//--- LIENS commande ---//

$contenu .= '<a href="?action=affichage_commande">Affichage commande</a><br>';

//--- AFFICHAGE Commandes ---//
//alert('Client = '.$client );
if(isset($_GET['action']) && $_GET['action'] == "affichage_commande")
{//{debug($_SESSION);
//echo 'Valeur de session.idmembre : '.$_SESSION[membre][id_membre];
$resultat = executeRequete("SELECT membre.pseudo, commande.id_membre, commande.id_commande, commande.montant,
commande.date_enregistrement, commande.etat
FROM `membre`,`commande`
WHERE membre.id_membre=commande.id_membre
AND commande.id_membre= $client
ORDER BY commande.id_membre, commande.id_commande" );
// Préparation Affichage des commandes
//debug($resultat);

while($colonne = $resultat->fetch_field())
{
//debug($colonne);
while ($ligne = $resultat->fetch_assoc())
{
//----------------------------------------------------------------------------------------------------
//$contenu .= '<table>';
$contenu .= '<fieldset>';
$contenu .= '<form id="comform" method="POST" enctype="multipart/form-data" >';
$contenu .= '<a><strong>Pseudo : <input class="etcmd" readonly type="text" size="8" name="pseudo" value="' . $ligne['pseudo'] . ' "</input></a>';
$contenu .= '<a> Date_enregistrement : <input class="etcmd" readonly type="text" size="15" name="date_enregistrement" value="' . renvoiDateFR($ligne['date_enregistrement']) . ' "</input></a><br>';
$contenu .= '<a hidden ><strong>id_membre : <input readonly type="text" size="10" name="id_membre" value="' . $ligne['id_membre'] . '"</input></strong></a><br>';
$contenu .= '<a><strong>id_commande : <input class="etcmd" readonly type="text" size="10" name="id_commande" value="' . $ligne['id_commande'] . ' "</input></strong></a>';
$contenu .= '<a>montant : <input class="inputtx" readonly type="text" size="5" name="montant" value="' . $ligne['montant'] . ' "</input></a>';

$contenu .= '<a>etat : <input class="etcmd" readonly type="text" size="15" name="etat" value="'.$ligne['etat'] . '"</input></a><br>';
$contenu .= '<input type = submit name="bouton_c" class="suppression" value="suppression_commande" OnClick="return(confirm(\'Etes vous certain de vouloir supprimer la commande numéro '.$ligne['id_commande'].' ?\'));">';
//error_reporting(E_ALL);
$contenu .= '</form>';

//----------------------------------------------------------------------------------------------------
// Fin de l'affichage de l'entête de la commande

// début de l'affichage des details de la commande
$num_commande=$ligne['id_commande'];
//debug($ligne);

$resultat2 = executeRequete("SELECT
cmd.id_commande, dcmd.id_details_commande , dcmd.id_produit , quantite, prix_unitaire, dcmd.prix , pro.photo, reference
FROM
commande cmd, details_commande dcmd, produit pro
WHERE
cmd.id_commande=dcmd.id_commande AND dcmd.id_produit= pro.id_produit
AND cmd.id_commande=$num_commande
ORDER BY
cmd.id_commande, dcmd.id_details_commande");
$contenu .= '<a><strong> Affichage des articles de la commande n° </strong></a>';
$contenu .= $num_commande.' Nombre d\'article(s) enregistré(s) : ' . $resultat2->num_rows;
$contenu .= '<table border="0" cellpadding="3"><tr>';
$contenu .= '<th>id_commande</th>';
$contenu .= '<th>id_details_commande</th>';
$contenu .= '<th>id_produit</th>';
$contenu .= '<th>Nb</th>';
$contenu .= '<th>Prix_unitaire</th>';
$contenu .= '<th>Prix</th>';
$contenu .= '<th>Photo</th>';
$contenu .= '<th>reférence</th>';
$contenu .= '</tr>';
while ($ligne_dcmd = $resultat2->fetch_assoc())
{
//debug($ligne_dcmd);
$contenu .='<form id= detail_commande action= '.$_SERVER['PHP_SELF'].' method="POST" enctype="multipart/form-data" >';
$contenu .= '<tr>';
$contenu .= '<td><input readonly type="text" size="10" name="id_commande" value="' . $ligne_dcmd['id_commande'] . '"</input></td>';
$contenu .= '<td><input readonly type="text" size="10" name="id_details_commande" value="' . $ligne_dcmd['id_details_commande'] . '"</input></td>';
$contenu .= '<td><input readonly type="text" size="10" name="id_produit" value="' . $ligne_dcmd['id_produit'] . '"</input></td>';
$contenu .='<td><select class="shortenedSelect" name="quantite" onchange="document.getElementById(\'bouton_dc_modification_produit\').click()">';
$contenu .= get_options($ligne_dcmd['quantite'],$ligne_dcmd['id_produit']);
$contenu .='</select></td>';
$contenu .= '<td><input readonly type="text" size="10" name="prix_unitaire" value="' . $ligne_dcmd['prix_unitaire'] . '"</input></td>';
$contenu .= '<td><input class="inputtx" type="text" size="10" name="prix" value="' . $ligne_dcmd['prix'] . '"</input></td>';
$contenu .= '<td><img src="' . $ligne_dcmd['photo'] . '" width="30" height="30"></td>';
$contenu .= '<td><input readonly type="text" size="10" name="reference" value="' . $ligne_dcmd['reference'] . '"</input></td>';
$contenu .= '<td><input type=submit name="bouton_dc" class="modification" value="modification_produit" id="bouton_dc_modification_produit"></td>';
$contenu .= '<td><input type=submit name="bouton_dc" class="suppression" value="suppression_produit" OnClick="return(confirm(\'Etes vous certain de vouloir supprimer le produit numéro '.$ligne_dcmd['id_produit'].' ?\'));"></td>';
$contenu .= '</tr>';
$contenu .='</form>';
}
$contenu .= '</table>';
$contenu .= '</fieldset>';
// fin de affichage details commande
}
}
}

//$_GET['action'] == 'affichage_commande';
//--------------------------------- AFFICHAGE HTML ---------------------------------//
require_once("./inc/haut.inc.php");

echo $contenu;
//--------------------------------- AFFICHAGE détail commande ---------------------------------//
//require_once("affiche_commande.php");
//--------------------------------- AFFICHAGE bas de page ---------------------------------//
require_once("./inc/bas.inc.php");
?>

Re: onchange="this.form.submit()"

par ynx » 05 févr. 2022, 10:33

Le problème peut venir du code html si celui-ci contient des erreurs.
Tu peux voir le code source de ta page via un clic droit dans ton navigateur, puis copier le code html dans le validateur w3c pour vérifier les erreurs :
https://validator.w3.org/#validate_by_input

Re: onchange="this.form.submit()"

par htitushg » 04 févr. 2022, 20:13

Voila ce que j'obtiens avec la fonction debug ($_POST):
Debug demandé dans le fichier : /var/www/html/site/mes_commandes.php à la ligne 126

Array
(
[id_commande] => 64
[id_details_commande] => 79
[id_produit] => 4
[Nb] =>
[prix_unitaire] => 26
[prix] => 26
[reference] => 3
[bouton_dc] => modification_produit
)
Pas de Nb !

Re: onchange="this.form.submit()"

par htitushg » 04 févr. 2022, 20:06

Merci ynx pour votre message: je comprends que sur l'évènement onchange du select, on simule le click du bouton et donc on génère l'appel modification_produit.
j'ai encore un problème, dans le traitement de modification_produit, je récupère dans la variable _POST tous les champs, sauf le Nb ! c'est curieux, car le nom du select est bien Nb, et l'appui du bouton devrait envoyer dans le tableau _POST toutes les variables du formulaire.
Merci de me dire ce que vous en pensez.
Cordialement
Htitushg

Re: onchange="this.form.submit()"

par ynx » 04 févr. 2022, 13:25

Bonjour,

Une solution possible en ajoutant un identifiant sur le bouton submit "modification_produit" :
<input type="submit" name="bouton_dc" value="modification_produit" id="bouton_dc_modification_produit">
Puis en cliquant sur ce bouton pour envoyer le formulaire dans l'attribut onchange :
onchange="document.getElementById('bouton_dc_modification_produit').click()"

onchange="this.form.submit()"

par htitushg » 04 févr. 2022, 12:01

Bonjour à tous
J'ai un formulaire d'affichage de commandes client, dans ce formulaire j'ai plusieurs boutons qui permettent de déclencher une modification du nombre de produits commandés ou une suppression d'un produit commandé.
dans ce formulaire, j'affiche :
$contenu .='<form action= '.$_SERVER['PHP_SELF'].' method="post" enctype="multipart/form-data" >';
$contenu .= '<tr>';
$contenu .= '<td><input readonly type="text" size="10" name="id_commande" value="' . $ligne_dcmd['id_commande'] . '"</input></td>';
$contenu .= '<td><input readonly type="text" size="10" name="id_details_commande" value="' . $ligne_dcmd['id_details_commande'] . '"</input></td>';
$contenu .= '<td><input readonly type="text" size="10" name="id_produit" value="' . $ligne_dcmd['id_produit'] . '"</input></td>';
$contenu .='<td><select name="Nb" onchange="this.form.submit()";>';
$selected=$ligne_dcmd['Nb'];
$contenu .= get_options($selected,$ligne_dcmd['id_produit'] ); //'<option value="'.$ligne_dcmd['Nb'].'"'. $selected.'">'.$j.' </option>';
$contenu .='</select></td>';
$contenu .= '<td><input readonly type="text" size="10" name="prix_unitaire" value="' . $ligne_dcmd['prix_unitaire'] . '"</input></td>';
$contenu .= '<td><input type="text" size="10" name="prix" value="' . $ligne_dcmd['prix'] . '"</input></td>';
$contenu .= '<td><img src="' . $ligne_dcmd['photo'] . '" width="30" height="30"></td>';
$contenu .= '<td><input readonly type="text" size="10" name="reference" value="' . $ligne_dcmd['reference'] . '"</input></td>';
$contenu .= '<td><input type = submit name="bouton_dc" value="modification_produit"></td>';
$contenu .= '<td><input type = submit name="bouton_dc" value="suppression_produit"></td>';
$contenu .= '</tr>';
$contenu .='</form>';
je traite l'appui sur le bouton "modification_produit" avec :
if((isset($_POST['bouton_dc']) && $_POST['bouton_dc'] == "modification_produit")
de même je traite l'appui sur le bouton "suppression_produit"
Par contre dans la liste déroulante j'affiche le nombre de produits disponible et je souhaiterais que lors du onchange="this.form.submit()"; je puisse envoyer vers le traitement "modification_produit" : comment faire ?
Merci pour votre aide
Cordialement
htitushg