jQuery gegenereerde input velden opslaan in database?
Ik ben bezig met het creëren van een eigen facturatiesysteem (invullen, opslaan, wijzigen, pdf, afdrukken)
Tot op heden heb ik de eerste fase afgerond. Er kan dus een factuur worden ingevuld en met behulp van jQuery kunnen er extra factuurvelden (rijen) worden toegevoegd.
Probleem:
Nu zou ik dus graag de ingevulde velden allemaal willen opslaan in een database, en nadien ophalen.
Maar omdat verschillende invul velden gegenereerd zijn met jQuery, kom ik er totaal niet uit hoe ik al deze velden kan verwerken met php..
Hoe zou ik ieder gegenereerd veld een aparte naam kunnen geven, en het juiste aantal velden door php laten verwerken? Aangezien niet elke factuur evenveel velden vereist.
Kan iemand mij uitleggen hoe ik dit het best kan doen? Eventueel met voorbeeld?
Bedankt!
dus dan had ik met jquery steeds bijv.
rij1
rij2
rij3
waarbij alleen de cijfer veranderde en in mijn table had ik rij1 tm rij 8 zelf erin gezet..
als je hiermee genoeg geholpen zou kunnen zijn dan zou je het zo op kunnen lossen als er iemand een beter manier weet dan wil ik dat zelf ook graag weten :)
Bedankt.
Gewijzigd op 13/03/2012 20:40:10 door Xaboteur X
Maar om de velden zo te verwerken, als array, is wel mogelijk, maar dan ga ik problemen krijgen met ze te onderscheiden vrees ik...
Gewijzigd op 13/03/2012 21:24:10 door Xaboteur X
Als je het op een juiste, genormaliseerde manier wilt oplossen dan moet je een manier bedenken om elke "regel" met extra velden op je factuur ook als een regel (record) in je database op te slaan. Zodat je altijd genoeg records kunt aanmaken en nooit te veel lege records hebt. Dan kom je dus bij de manier van Vincent uit. Op zich is dit ook zeker geen omslachtige manier en zeker niet minder efficient, in tegendeel. In het begin misschien wat lastiger, zeker conceptueel, maar voor de toekomst een betere methode.
Als je hier iets meer info kan plaatsen met hoe de info er uit ziet, of kan zien, dan kunnen we je vast wel op weg helpen met de juiste structuur.
Dus, zodra de factuurpagina wordt geladen, staat er één rij invulvelden hard-gecodeerd in de html.
Door middel van het '+' en '-' icoontje, kan ik met jQuery rijen toevoegen, of verwijderen.
En met behulp van de vinkjes aan de rechterkant kan ik vooraf ingestelde modules toevoegen.
De lege, 'custom' rijen hebben volgende html:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<tr class="tr-custom">
<td><input type="text" class="input-custom input-txt" name="customtxt[]" /></td>
<td><input type="text" class="input-custom input-int input-aantal" name="customamount[]" /></td>
<td><input type="text" class="input-custom input-int input-prijs" value="0,00" name="customprice[]" /></td>
<td><input type="text" class="input-custom input-int input-totaal" value="0,00" name="customtotal[]" /></td>
</tr>
<td><input type="text" class="input-custom input-txt" name="customtxt[]" /></td>
<td><input type="text" class="input-custom input-int input-aantal" name="customamount[]" /></td>
<td><input type="text" class="input-custom input-int input-prijs" value="0,00" name="customprice[]" /></td>
<td><input type="text" class="input-custom input-int input-totaal" value="0,00" name="customtotal[]" /></td>
</tr>
En de modules worden als volgt ingevoegd:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
$("table.fact-table tr:last").after("
<tr class=\"tr-"+module+" tr-module\">
<td class=\"module\"><span class=\"module-tag\">[module]</span> "+module+"<input type=\"hidden\" value=\""+module+"\" name=\""+module+"\" /></td>
<td><input type=\"text\" class=\"input-int input-aantal\" value=\"1\" name=\""+module+"Amount\" /></td>
<td class=\"module-prijs\"><input type=\"text\" class=\"input-int input-prijs\" value=\""+prijs.toFixed(2).replace(/\./g, ",")+"\" name=\""+module+"Price\" /></td>
<td class=\"column-total module-total\"><input type=\"text\" class=\"input-int input-totaal\" value=\""+prijs.toFixed(2).replace(/\./g, ",")+"\" name=\""+module+"Total\" /></td>
</tr>");
<tr class=\"tr-"+module+" tr-module\">
<td class=\"module\"><span class=\"module-tag\">[module]</span> "+module+"<input type=\"hidden\" value=\""+module+"\" name=\""+module+"\" /></td>
<td><input type=\"text\" class=\"input-int input-aantal\" value=\"1\" name=\""+module+"Amount\" /></td>
<td class=\"module-prijs\"><input type=\"text\" class=\"input-int input-prijs\" value=\""+prijs.toFixed(2).replace(/\./g, ",")+"\" name=\""+module+"Price\" /></td>
<td class=\"column-total module-total\"><input type=\"text\" class=\"input-int input-totaal\" value=\""+prijs.toFixed(2).replace(/\./g, ",")+"\" name=\""+module+"Total\" /></td>
</tr>");
Ik hoop dat dit een beetje duidelijk is... :)
Gewijzigd op 13/03/2012 23:09:55 door Xaboteur X
- beschrijving (naam van het product)
- aantal
- prijs
(- totaal, maar dat is een product van aantal en prijs, kan je dus op elk moment berekenen)
Dit is in feite al de structuur van je tabel, hoewel je het nog ietsje moet uitbreiden als je het echt netjes genormaliseerd wilt hebben. Dan maak je een tabel voor de producten (waarin je product specifieke info zet als naam, beschrijving en prijs) en een koppel tabel waarin je de producten aan de facturen koppelt. Je zou dan uitkomen op een structuur min of meer als volgt:
tabel: facturen (deze tabel heb je als het goed is al)
- factuur_id
- klant
- adres
- etc etc
tabel: producten
- product_id
- product_naam
- beschrijving
- prijs
tabel: factuur_product
- id
- factuur_id
- product_id
- aantal
Zo kan je een many-to-many relatie aanleggen tussen je producten en de facturen.
Gewijzigd op 13/03/2012 23:22:11 door Erwin H
http://www.phphulp.nl/php/tutorial/overig/normaliseren/150/
en dit in combinatie wat erwin voorgelegd heeft kom je al een heel eind met normaliseren volgens mij.
ik had toen ik met zoiets bezig was mijn db niet goed genormaliseerd en kwam wel tegen behoorlijk veel problemen aan.
dus normaliseren is wat erwin zegt inderdaad heel verstandig en belangrijk voor in de toekomst ook.
mijn methode dus alleen gebruiken als het echt niet meer kan. :)
Maar mijn probleem is nu, als ik dus mijn factuur heb ingevuld (vb: img 2), hoe ik al die velden kan opslaan in de database?
Aangezien lege invulvelden en modulevelden gegenereerd worden met bovenstaande code via jQuery...
Het probleem is dus eigenlijk het genereren van nieuwe invulvelden, die ook door php verwerkt moeten worden en in de database moeten worden gestoken. En nadien kunnen opgehaald worden op de juiste plaats, voor wijzigingen aan te brengen. Maar dit laatste is nog niet echt van belang nu.
Hoe stuur je het van de client naar de server? Via een standaard form actie (post)?
Dat is de bedoeling ja, eventueel met een $.ajax post.
Probeer het gewoon stap voor stap te doen. Alles bij elkaar lijkt het misschien een beetje complex, maar stap voor stap zijn het allemaal zaken die je al kent.
Wil je het niet via ajax doen, maar gewoon met een normale post actie dan kan het ook. Zorg dat je hele tabel in een form staat zodat alles mee gaat. Geef dan elke regel een volgnummer (de eerste 0, de tweede 1, de derde 2 etc) en geef de naam van de inputs hetzelfde volgnummer mee ("naam0", "aantal0", "prijs0" etc.). Zelf zou ik er ook een hidden input bij geven waarin dit volgnummer ook verwerkt zit, dan weet je zeker dat je een element in je POST array krijgt die elk volgnummer heeft. Dus bijvoorbeeld een hidden input met een naam "regel0", waarde doet er niet toe, kan gewoon 1 zijn.
Dan op de server loop je met een while loop door de POST array heen:
Code (php)
Per loop kan je dus een regel uitlezen en opslaan.
Gewijzigd op 13/03/2012 23:44:57 door Erwin H
Maar hoe zou ik best de waardes opslaan in de database?
Dan moet ik de facturen tabel op voorhand een groot aantal kolommen geven, zodat ik zeker alle waardes kan opslaan?
Graag zou ik de waardes makkelijk onderscheidbaar willen kunnen ophalen..
Gewijzigd op 14/03/2012 23:48:21 door Xaboteur X
Zie een vorige post. Je hebt drie tabellen nodig. De factuur tabel, een product tabel en een koppeltabel.
Hoe kan ik het best al die gegevens in één record zetten?
Of mis ik iets?
Gewijzigd op 15/03/2012 13:51:28 door Xaboteur X
Erwin H op 13/03/2012 23:21:41:
tabel: facturen (deze tabel heb je als het goed is al)
- factuur_id
- klant
- adres
- etc etc
tabel: producten
- product_id
- product_naam
- beschrijving
- prijs
tabel: factuur_product
- id
- factuur_id
- product_id
- aantal
Zo kan je een many-to-many relatie aanleggen tussen je producten en de facturen.
tabel: facturen (deze tabel heb je als het goed is al)
- factuur_id
- klant
- adres
- etc etc
tabel: producten
- product_id
- product_naam
- beschrijving
- prijs
tabel: factuur_product
- id
- factuur_id
- product_id
- aantal
Zo kan je een many-to-many relatie aanleggen tussen je producten en de facturen.
Dat lijkt me toch duidelijk genoeg.
1 kanttekening: De prijs van een product is momentgebonden dus zou in de factuur_product tabel erbij moeten
Xaboteur X op 15/03/2012 13:50:56:
Ja, maar een factuur kan toch meerdere producten bevatten?
Hoe kan ik het best al die gegevens in één record zetten?
Of mis ik iets?
Hoe kan ik het best al die gegevens in één record zetten?
Of mis ik iets?
Blijkbaar wel, want zoals ik dus al zei je kan per facturen meerdere regels in die andere tabel hebben.
En Ger heeft inderdaad gelijk met die prijs. Misschien wil je die niet in de producttabel hebben inderdaad. Ik dacht later ook aan kortingen die bepaalde klanten kunnen krijgen waardoor de prijs anders is en als de prijs in de product tabel staat heb je daar een probleem mee.
De Factuur-Product tabel kan er dus als volgt uitzien:
fact_id - prod_id
123 - 22
123 - 23
123 - 34
124 - 11
124 - 14
Ik had er dus niet rekening mee gehouden dat er meerdere dezelfde factuur_id's in die tabel konden, maar dat is net de bedoeling van heel die normalisatie he! :)
Excuses..
Bedankt!
Precies ;-)