Alle formulier-velden doorlopen
Ik ben bezig met een redelijk groot project waarbij ik veel (aardig grote) formulieren moet ontwikkelen. De gegevens van deze formulieren moeten uiteindelijk in de database komen te staan.
De database zit ongeveer zo in elkaar:
Tabel: formuliervelden
Kolommen: id, formulier_id, veldnaam
Tabel: formulierwaarden
Kolommen: id, formulierveld_id, waarde
In formuliervelden heb ik bijvoorbeeld twee rijen:
1 - 1 - 'Voornaam'
2 - 1 - 'Achternaam'
In formulierwaarden heb ik dan bijvoorbeeld:
1 - 1 - 'Kevin'
2 - 2 - 'de Groot'
De structuur klopt niet volledig, maar ik hoop dat het idee een beetje duidelijk is. De tabel formuliervelden houdt, zeg maar, de stamgegevens en formulierwaarden houdt de waarden per formulier.
Nu wil ik gewoon graag in HTML de formulieren maken en onderaan de formulieren een Javascript-code uitvoeren die door alle formuliervelden loopt. De namen van de formuliervelden moeten dan op het scherm geprint worden en hiermee moet dan de query zichtbaar worden. Dan kan ik die query kopiëren en in phpMyAdmin plakken.
Wat ik dusver heb:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<script type="text/javascript">
var formulier_id = 1337;
document.write('INSERT INTO formuliervelden (formulier_id, veldnaam) VALUES<br />');
$('#formulier').find(':input').each(function(i) {
document.write('('+ formulier_id +', \''+ this.name +'\'), <br />');
});
</script>
var formulier_id = 1337;
document.write('INSERT INTO formuliervelden (formulier_id, veldnaam) VALUES<br />');
$('#formulier').find(':input').each(function(i) {
document.write('('+ formulier_id +', \''+ this.name +'\'), <br />');
});
</script>
Bovenstaande code gaat door alle elementen heen en dit gaat goed. Echter met radio- of checkbox-elementen gaat dit mis. Voorbeeld:
Code (php)
1
2
2
<input type="radio" name="geslacht" value="m" /> Man<br />
<input type="radio" name="geslacht" value="v" /> Vrouw<br />
<input type="radio" name="geslacht" value="v" /> Vrouw<br />
Of met checkboxes (met geslacht is dit onlogisch, maar het gaat om het idee):
Code (php)
1
2
2
<input type="checkbox" name="geslacht" value="m" /> Man<br />
<input type="checkbox" name="geslacht" value="v" /> Vrouw<br />
<input type="checkbox" name="geslacht" value="v" /> Vrouw<br />
Met de genoemde Javascript-code komt het veld "geslacht" dus tweemaal voor.
Mijn vraag: hoe kan ik dit het beste oplossen? Een array aanmaken o.i.d.? Ik moet in feite kunnen groeperen op element-naam.
Voorbeeld: http://kevindg.nl/formulier/
Note: in geval van checkboxes wordt het element een array en is het de bedoeling dat de waarden m.b.v. PHP-functie "implode()" kommagescheiden in de database komen te staan. In geval van radio-elementen is het gewoon de value die het element heeft.
Alvast bedankt voor de tijd en moeite.
Gr. Kevin
Toevoeging op 15/02/2013 11:20:37:
Het is gefixed:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
Array.prototype.contains = function(val)
{
var i = this.length;
while (i--)
{
if (this[i] === val)
{
return true;
}
}
}
var query = 'INSERT INTO formuliervelden (formulier_id, veldnaam) VALUES\n';
var elementen = document.getElementById('formulier').elements;
var aantal = elementen.length;
var behandeld = new Array();
for (var i = 0; i < aantal; i++)
{
if (elementen[i].name != '[CSRF-element]' && elementen[i].name != '[CSRF-element]')
{
if (behandeld.contains(elementen[i].name) == true)
{
continue;
}
query += '('+ formulier_id +', \''+ elementen[i].name +'\')';
if (i < (aantal - 1))
{
query += ',\n';
}
else
{
query += ';';
}
behandeld[i] = elementen[i].name;
}
}
document.write('<textarea style="display: block; border: 1px solid #000; padding: 10px; background-color: #f90; width: 1000px; height: 250px; margin: 0 auto;" onClick="javascript: this.select();">');
document.write(query);
document.write('</textarea>');
{
var i = this.length;
while (i--)
{
if (this[i] === val)
{
return true;
}
}
}
var query = 'INSERT INTO formuliervelden (formulier_id, veldnaam) VALUES\n';
var elementen = document.getElementById('formulier').elements;
var aantal = elementen.length;
var behandeld = new Array();
for (var i = 0; i < aantal; i++)
{
if (elementen[i].name != '[CSRF-element]' && elementen[i].name != '[CSRF-element]')
{
if (behandeld.contains(elementen[i].name) == true)
{
continue;
}
query += '('+ formulier_id +', \''+ elementen[i].name +'\')';
if (i < (aantal - 1))
{
query += ',\n';
}
else
{
query += ';';
}
behandeld[i] = elementen[i].name;
}
}
document.write('<textarea style="display: block; border: 1px solid #000; padding: 10px; background-color: #f90; width: 1000px; height: 250px; margin: 0 auto;" onClick="javascript: this.select();">');
document.write(query);
document.write('</textarea>');
Er zijn nog geen reacties op dit bericht.