orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010
-
20 nov. 2007 à 08:43
fouratinourhen -
24 mai 2011 à 16:06
J'aimerais à présent, à chaque ajout de ligne, vérifier préalablement que l'utilisateur a bien saisi une valeur dans toutes les zones. Comment faire pour balayer les 5 cellules de chaque ligne (un simple test d'existence des données suffirait)?
Voici les fonctions JS permettant la gestion dynamique du tableau des lignes de commande :
/* trouve le tag "parentTagName" parent de "element" */
function getParent(element, parentTagName) {
if ( ! element )
return null; else if ( element.nodeType 1 && element.tagName.toLowerCase() parentTagName.toLowerCase() )
return element;
else
return getParent(element.parentNode, parentTagName);
}
/* ajoute une ligne */
function addLigne(link)
{
// 0. tester la saisie sur toutes les zones.
// 1. récuperer le node "TABLE" à manipuler
var td = link.parentNode;
var table = getParent(td,'TABLE');
// 2. on va manipuler le TBODY
var tbody = table.tBodies[0];
// 3. on clone la ligne de reference
var newTr = tbody.rows[0].cloneNode(true);
tbody.appendChild(newTr);
if ( document.all )
newTr.style.display = "block"; // pour IE
else
newTr.style.display = "table-row"; // pour Gecko
}
/* supprimer une ligne */
function delLigne(link)
{
// 1. récuperer le node "TABLE" à manipuler
var td = link.parentNode;
var table = getParent(td, 'TABLE');
// 2. récuperer le TBODY
var tbody = table.tBodies[0];
// 3. Supprimer le TR
tbody.removeChild(getParent(td, 'TR'));
}
window.onload = dtableInit;
/* initialise le script */
function dtableInit()
{
var table = document.getElementsByTagName('TABLE');
for ( var i = 0; i < table.length; i++ )
{
// on récupère tous les tableaux dynamiques
if ( table[i].className == 'dTable' )
{
var tbody = table[i].tBodies[0];
var newTr = tbody.rows[0].cloneNode(true);
// on masque la première ligne du tbody (la ligne de reference)
tbody.rows[0].style.display = 'none';
// on en ajoute une
tbody.appendChild(newTr);
}
}
}
Et le code html correspondant :
----
Part Number,
Description,
Prix unitaire HT,
Qté,
Total,
Action,
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 20 nov. 2007 à 14:36
C'est nickel, ça fonctionne aussi bien sur IE que FF (et ça suffira comme ça avec les navigateurs!).
Par contre, comment récupérer dans ma page php les valeurs de ces cellules dont je connais à présent les Id?
Jusqu'à maintenant, je conservais les valeurs des autres champs saisis en rappelant la page html avec ceux-ci passés en paramètre de l'adresse (je ne sais faire qu'ainsi...), avec cette fonction :
function refresh()
{
var num_cde_client;
num_cde_client = '';
(...)
num_cde_client = document.boncde.num_cde_client.value;
document.location='{#LIEN}'+'?&num_cde_client='+num_cde_client+'&date_dde='+date_dde+'&societe='+societe+'&adresse='+adresse+'&demandeur='+demandeur+'&tel='+tel+'&constructeur='+constr+'&createur='+creat+'&client='+cli;
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 20 nov. 2007 à 15:29
Ca ne fonctionne pas, je récupère bien les valeurs des autres champs saisis, mais pas celles des lignes ajoutées.
Voici le code de mon bouton de validation :
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 21 nov. 2007 à 14:43
J'ai installé FireBug, je ne connaissais pas, c'est bien pratique!
Je parviens maintenant à imposer un Id à toutes les zones saisies.
Reste à récupérer ces valeurs lorsqu'on valide la saisie globale.
Les autres valeurs du formulaire sont repassées en paramètre de l'adresse de la page à chaque changement de zone, donc pas de souci de ce côté-là.
Par contre, impossible de récupérer les valeurs des lignes pour lesquelles j'ai imposé l'Id dans la page php, même si je détecte bien l'action sur le bouton de validation.
Le print_r($_POST) n'affiche en effet que les 'autres' valeurs.
Une idée? :o)
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 21 nov. 2007 à 15:11
Cette fonction, je l'appelle au moment de la validation du formulaire?
Comme ça? :
Parce qu'avec cette solution, je retrouve encore une fois les autres valeurs, mais pas celle avec un Id en "champ_*_*", alors qu'elle sont identifiées! :-/
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 21 nov. 2007 à 15:22
D'autre part, j'ai dans FireBug (en plusieurs exemplaires), les messages d'erreur suivants :
uncaught exception: Permission refusée d'appeler la méthode Location.toString
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 21 nov. 2007 à 15:49
Ah, je pense avoir trouvé : il fallait aussi alimenter la propriété "name" de chaque cellule en input... ou alors travailler avec Id dans ta fonction "sauvage".
D'ailleurs, quelle est la différence entre Id et name?
tu peux essayer d'appeler submitForm() avec ce genre de formulaire bidon. Tant que tu ne récupères pas la valeur du champ au niveau de ton serveur, c'est qu'il y a un problème. Si tout va bien, les champs contenus dans ton tableau, lui-même inclus dans ton 'vrai' formulaire devraient passer aussi.
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 22 nov. 2007 à 14:58
J'essaie maintenant de mettre à jour les totaux de mon formulaire au fur et à mesure de la saisie des lignes.
Dans un premier temps, et pour visualiser les changement, j'applique une coloration à la partie de je veux atteindre.
Pourquoi ne puis-je atteindre que le tableau 'tab_tot' et pas la cellule 'totht'?
Total €uro HT
... avec ce code :
var cell_tot_ht = document.getElementById("tab_tot"); [ou getElementById("totht")]
cell_tot_ht.bgColor="#CCFFCC";
Anthed
Messages postés152Date d'inscriptiondimanche 20 février 2005StatutMembreDernière intervention17 janvier 20143 22 nov. 2007 à 15:24
N'hésite pas à tester ton code avec, par exemple :
alert(cell_tot_ht) pour vérifier que, déjà, ton élément est trouvé.
Ensuite, une petite modif du type :
cell_tot_ht.style.backgroundColor = "#CCFFCC";
devrait marcher.
Tu peux consulter les codes à dispo sur CS pour voir tout ce que tu peux faire avec element.style ...
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 22 nov. 2007 à 15:36
var lg = document.getElementById("tab_tot").childNodes.length;
alert('lg->'+lg);
var cell_tot_ht = document.getElementById("tab_tot").childNodes[0].nodeValue;
alert('valeur1->'+cell_tot_ht);
var cell_tot_ht = document.getElementById("tab_tot").childNodes[1].nodeValue;
alert('valeur2->'+cell_tot_ht);
En fait, je détecte la 'longueur' de mon tableau 'tab_tot' : 2
Le 2, c'est bien pour le nombre de <td>?
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 26 nov. 2007 à 15:05
J'en suis à la gestion de la suppression d'une ligne.
La suppression en elle-même fonctionne bien, mais je ne parviens pas à récupérer une des valeurs (le montant HT en l'occurence) pour la déduire du total HT de mon formulaire.
Actuellement, j'ai ça :
function delLigne(link)
{
// 1. récuperer le node "TABLE" à manipuler
var td = link.parentNode;
var table = getParent(td,'TABLE');
// 2. récuperer le TBODY
var tbody = table.tBodies[0];
// 2bis. récupérer la valeur HT de la ligne pour la soustraire au total HT du bon de commande.
var ligne=getParent(td,'TR');
alert(ligne.innerHTML); => renvoie la structure complète de la ligne
alert(ligne.nodeName); => renvoie bien 'TR'
// 3. Supprimer le TR
tbody.removeChild(getParent(td,'TR'));
}
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 26 nov. 2007 à 15:22
(oups, cliqué trop vite)
Mais si je demande le getParent(td,'TD'), je me retrouve avec les infos de la cellule sur laquelle j'ai cliqué pour supprimer la ligne.
Or, les infos que je cherche sont placées dans la cellules précédente.
Je me disais qu'il fallait que je remonte jusqu'au TR pour redescendre ensuite au TD qui contient ma valeur.
J'ai juste?
orionis1
Messages postés40Date d'inscriptionmardi 20 novembre 2007StatutMembreDernière intervention 7 juillet 2010 26 nov. 2007 à 15:36
Ah bé oui, forcément, ça paraît plus simple! :o)
Alors, c'est bon jusqu'à la définition de cell.
En fait, ma zone n'est pas en input, puisque c'est le montant HT calculé à partir de la qté (saisie) et du montant unitaire (saisi).
Dans la partie 'saisie' et malgré les lignes :
with(input)
{
value = totht.nombreFormate(2,",","");
id = "champ_" + i + "_" + j;
name = "champ_" + i + "_" + j;
nodeValue = totht.nombreFormate(2,","," ");
}
nodeValue donne bien la valeur affichée dans la cellule, mais je ne parviens pas à lui forcer un Id et un Name, donc j'imagine que ça m'empêche de récupérer maintenant sa valeur?