comment faire ? insertion dynamique de lignes dans un tableau - PHP - Programmation
Marsh Posté le 11-12-2003 à 11:18:35
J'y avais pensé mais je me demandais s'il n'y avait pas une autre solution.
je vais tenter cette voie.
Si tu connais un site avec un exemple, je suis preneur.
Marsh Posté le 11-12-2003 à 11:25:02
ben commence déjà à bosser dessus..
et montre nous.. si t'as un probleme, je serais ravi de t'aider..
mais par contre ici on est pas du style à te faire les exos à ta place
Marsh Posté le 11-12-2003 à 12:04:26
Kermit_the_Frog a écrit : Dans le cadre d'un stage, je dois réaliser un écran qui permet d'ajouter des lignes ou d'en supprimer dans un tableau affiché dans la page. |
Ben c'est pas dur.
Tu fait donc une page de formulaire qui contient ton tableau. En bas de ce tableau donc le formulaire qui pointe vers une page de traitement. Cette page de traitement va donc "traiter" les données du formulaire, fait ce qu'il faut dans la BDD puis renvoie à nouveau vers la page qui contient ton tableau et le formulaire.
Marsh Posté le 11-12-2003 à 12:37:53
Javascript
Démo :
Code :
|
Bon, y'a que la suppression, je te laisse faire l'insertion !
Avec IE, outerHTML, pour NS/MOZ : innerHTML (donc sans <table...> et </table> )
Edit : Correction, oubli des id pour les <input...>
Marsh Posté le 11-12-2003 à 13:14:41
merci beaucoup, je vais essayer tout ça (j'ai du pain sur la planche moi !)
Marsh Posté le 11-12-2003 à 13:20:27
Tiens, j'ai fait l'ajout aussi pour rigoler !
Code :
|
Marsh Posté le 11-12-2003 à 13:22:55
tu ne veux pas me faire un ajout de tes capacités dans mon cerveau par hasard ? ;-)
encore merci, un tout GRAND ! :-)
Marsh Posté le 11-12-2003 à 13:26:39
Bof, je l'ai pondu de mémoire.
J'ai déjà fais un truc dans le genre pour un projet.
A l'époque, j'avais mis un certain temps à le faire...
Marsh Posté le 12-12-2003 à 14:01:15
j'ai tenté de modifier mais ça fonctionne plus !
aaaahhh, j'suis trop paumé sur ce coup-là.
je nage en javascript et du coup, je ne saisis pas certaines subtilités de méthodes.
mon code :
Code :
|
Marsh Posté le 12-12-2003 à 14:36:16
Ben c'est pourtant pas compliqué...
Déjà, tu le sort d'où le mot clef 'const' ?
Cà n'existe pas ce truc. Met var et çà va déjà mieux.
Ensuite, dans genLigne(), tu as des SIZE='1' au lieu de SIZE="1".
Ben oui, le ' çà ferme ta chaine, alors fait gaffe.
Ensuite, dans add() tu utilises
HEADTABLE au lieu de
HEADERTABLE
Et çà, ben çà passe pas.
Ensuite, toujours dans add(). Il s'agit d'ajouter une ligne vide à la fin du tableau. genLigne() te retourne une ligne que tu ajoute à on tableau. Mais comme il faut regénérer le tableau entier tu fait çà :
tb = document.getElementById('tb').innerHTML + genLigne( nb , 'Nouvelle ligne N°' + nb );
Bon, tb contient l'ancien contenu du tableau plus une nouvelle ligne.
Ensuite, tu fait çà :
document.getElementById('tb').outerHTML = '<table id="tb">' + HEADTABLE + tb + '</table>';
Donc ton tableau conteint maintenant :
DEUX header + les lignes...
Au fait un header en html c'est pas
<td><b>Blabla</b></td> mais
<th>Blabla<th>
Enfin, pour ins() et del() on verra plus tard quand le début marchera, mais si tu ne met pas un id sur chaque input, tu ne pourra pas les lire pour regénérer le tableu avec ce que l'utilisateur à saisi.
Il faudra aussi modifier genligne() pour passer toutes les valeurs. Soit par autant de paramètres que de <input>, soit par un tableau...
Marsh Posté le 12-12-2003 à 14:43:43
ok, pour le const, j'étais persuadé que ça fonctionnait et puis non, non j'avais trouvé qu'il fallait l'enlever.
Pour les ' j'avais foiré un copier/coller venant de mon code PHP et pas fais gaffe, scrogneugneu
J'ai donc corrigé tout cela et ... ça va mieux :-)
mais j'ai encore une question "idiote" (on change pas une équipe qui gagne, merci de ta patience) :
je voudrais avoir une première ligne du tableau dès le chargement de la page.
Puis-je faire un appel de add() directement dans mon code php ?
Marsh Posté le 12-12-2003 à 14:47:31
Ben tu peux par exemple le faire dans body !
<body onload="add();">
Marsh Posté le 12-12-2003 à 14:48:31
merci le barbu, merci le barbu, merci !!!
j'ai déjà fait une partie des modifs, je continue ...
Marsh Posté le 12-12-2003 à 14:49:10
Et puis ce qui serait bien c'est :
un <html>
un <head>
un </body>
un </html>
Mais bon, s'est juste pour faire chier hein
Marsh Posté le 12-12-2003 à 14:50:24
Pense à nous montrer ce que çà donne une fois fini STP
Marsh Posté le 12-12-2003 à 14:54:07
pas de prob pour la diffusion une fois fini !
en ce qui concerne les balises html, tout est incorporé dans un include header php
Marsh Posté le 12-12-2003 à 14:56:46
Ok, c'est pour çà qu'on vois qu'un bout de code.
Le plus simple alors, c'est de montrer le HTML généré par PHP.
Parce-que pour débugger du javascript, il vaut mieux avoir EXACTEMENT la même chose que le navigateur
Marsh Posté le 12-12-2003 à 17:23:41
ça avance tout doucement
derniers points améliorés :
cool, je continue lundi paske là, c'est week-end !
Marsh Posté le 15-12-2003 à 19:00:03
Nouvelle version en utilisant DOM au lieu de bricoller le HTML
Code :
|
C'est compatible IE et MOZ.
IE pose juste un problème avec la définition des attributs qui sont des événements. Obligé de passer par un truc à la con spécial IE. Voir commentaires
Une solution envisageable pour remplacer la construction d'une ligne entièrement à la main en javascript :
Ajouter un tableau pas affiché (style="display:none;" ) avec une ligne de référence qu'il suffira de cloner.
Ce qui donne :
Code :
|
C'est quand même plus pratique comme çà, et en plus y'a plus le problème avec IE et le événements
Marsh Posté le 16-12-2003 à 11:18:52
c'est effectivement plus pratique au niveau du codage
Par contre, je viens de terminer d'adapter la première version à mes besoins.
voici le code HTML généré par PHP
Code :
|
et les deux fonctions javascript fort proches l'une de l'autre, mais bon soyons complet
add_remove_line_qualifications.js
Code :
|
add_remove_line_prof_trainings.js
Code :
|
voilà, j'espère que l'affichage ne sera pas trop pourri parce que je n'arrive pas à voir jusqu'où je peux aller avec une ligne
Je vais sans doute m'atteler à la modif' de ta dernière version le Barbu
j'ai encore une question pratique (décidément, ce topic vire de plus ne plus franchement vers le javascript) : je voudrais ouvrir une popup lors du click sur un lien (ou un bouton) lié à un champ afin de permettre au user de choisir une valeur dans une liste (par exemple) et ensuite remplir le champ avec cette valeur. Le problème est le passage du nom du champ à remplir pour pouvoir utiliser une affectation du type :
window.opener.document.forms[0].nomChamp.value = valeurRecupérée
je vais faire une recherche sur le forum javascript mais si tu as une idée ...
Marsh Posté le 16-12-2003 à 12:13:49
Avec ma nouvelle version effectivement tu va avoir un problème car je ne gère pas d'id pour chaque objet. Je passe juste 'this' à la fonction et je me débrouille avec les parentNode. Donc, quand tu clic sur un bouton de ton tableau pour ouvrir une fenêtre, il faut te débrouiller pour lui passer aussi une référence au champs de saisie à modifier.
Il faut regarder dans la doc du DOM pour trouver les méthodes qui vont bien.
Par exemple si tu as
<td>
<input...>
<button...></button>
</td>
Un clic sur le button vers une fonction avec this en paramètre.
this.parentNode est le td
this.parentNode.childNodes.item(0) est l'input !
Remarque sur ma dernière version.
Dans suppr( myNode ) par exemple, au lieu d'utiliser :
myNode.parentNode.parentNode.parentNode
pour désigner le <tbody>, je pourais faire :
document.getElementById('tb')
Ce qui serait plus lisible.
Mais çà limiterai la fonction à ce tableau. Comme c'est fait, il est possible de gérer plusieurs modèles de lignes de tableau avec les mêmes fonctions.
Autre remarque:
J'ai corrigé un petit bug dans la dernière version.
En fait en faisant un cloneNode du modèle de ligne, je fais une copie avec le même id
J'ai corrigé le js comme suis, pour effacer l'id après copie :
Code :
|
A+
Marsh Posté le 16-12-2003 à 12:22:40
Attention !
Dans :
Code :
|
Un clic sur le button vers une fonction avec this en paramètre.
this.parentNode.childNodes.item(0) est l'input seulement dans IE !
Dans MOZ, c'est l'item(1). A cause du retour à la ligne et de la tabulation entre <td> et <input> !
Dans MOZ, c'est considéré comme un textNode, et c'est lui l'item(0)
Donc soit tu boucle sur les item en cherchant celui dont nodeName=='input', soit tu écris le HTML comme çà :
Code :
|
Ca commence à devenir standard, mais c'est pas encore çà
Marsh Posté le 16-12-2003 à 12:46:56
cool !
une fois encore : merci pour tes bons conseils et tes solutions ô combien efficaces !
Marsh Posté le 18-12-2003 à 09:35:37
Modif dans la fonction suppr :
function suppr( myNode )
{
// myNode.parentNode.parentNode est le parent <tr> du parent <td> du bouton <button>+</button>
// Donc on supprime <tr> du bouton sur lequel on click.
myNode.parentNode.parentNode.removeNode( true );
}
Pas grand chose. En fait c'est plus simple de faire removeNode() sur les node à supprimer que removeChild() sur le parent
Le booléen, c'est pour dire que tous les childs du node supprimé le sont aussi.
Marsh Posté le 18-12-2003 à 11:27:17
Petite erreur
removeNode() est spécifique à IE
Marsh Posté le 11-12-2003 à 11:02:12
Dans le cadre d'un stage, je dois réaliser un écran qui permet d'ajouter des lignes ou d'en supprimer dans un tableau affiché dans la page.
Et ce, bien évidemment en n'effaçant pas les lignes déjà encodées.
L'insertion dans la base de données MySql ne devant se faire qu'après validation de l'ensemble.
Quelqu'un a-t-il une idée ou un lien avec un tuto ? Paske là, je queutte depuis quasi une semaine pour trouver une solution.
Merciiiiiiii