Formular per POST und GET mit html,php,mysql,js,ajax,prototype

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Formular per POST und GET mit html,php,mysql,js,ajax,prototype

    Hi, ich bin Schüler und arbeite derzeit an einem Projekt für einen realen Kunden. Teil des Auftrages ist ein Backoffice Bereich, welchen ich im großen und ganzen schon in php und html realisiert habe. Nun strebe ich eine ajax lösung an. Zu meiner freude komme ich schnell voran doch nun stehe ich vor einem Problem, welches ich auch nach vielem Googlen,Codeschnipsel ausprobieren nicht lösen kann.

    Nun zu meinem Problem:
    Zurzeit generiere ich mithilfe einer übergeordneten PhP Funktion Seiten(beschrenken sich auf einfache Tabellen und Formulare). Diese hole ich mir mit Ajax und schreibe den Inhalt einfach in ein div. Alle möglichen Übergaben laufen bei mir über die URL, da es ein Backoffice Bereich ist und der Kunde damit kein Problem hat nicht weiter Tragisch. Nun gibt es aber Formulare, welche eine zu große Menge an Daten übertragen, dass ich sie nicht mit der URL übergeben kann. Des weiteren wll ich verhindern, dass Datenbankeintäge mittels URL aufruf erstellt werden können.

    in meiner index.html, in der alles geladen wird (tabellen, formulare, usw) rufe ich einfach zu beginn die funktion startCheck auf, welche mir die Seite mit hilfe der daten in der url aufbaut

    Quellcode

    1. Event.observe(document, 'dom:loaded', startCheck);


    ich unterscheide zwischen zwei ajax aufrufen post/get (ich verwende einen post request wenn ich in der url &sup finde)

    global.js

    Quellcode

    1. function startCheck()
    2. {
    3. var url_menue = "../new/menuelinks.php"
    4. if(document.URL.indexOf("test")!==-1)
    5. {
    6. new Ajax.Updater("incontent","../new/test.php",{
    7. method: "post",
    8. parameter:"name=text"
    9. })
    10. }
    11. else
    12. {
    13. if(document.URL.indexOf("?")!==-1){
    14. var location = false
    15. var menue = false
    16. var uebergabe = false
    17. var superior = false
    18. var parameters=document.URL.split("?").last().split("&")
    19. parameters.each(function(parameter)
    20. {
    21. if(!parameter.startsWith("http"))
    22. {
    23. var para = parameter.split("=")
    24. switch (para.first())
    25. {
    26. case "loc":
    27. if(para.last().indexOf(",")===-1)
    28. {
    29. location = para.last()
    30. }
    31. else
    32. {
    33. if(para.last().split(",").last()=="")
    34. {
    35. location = para.last().split(",").last()
    36. }
    37. else
    38. {
    39. location = para.last().split(",").first()+"/"+para.last().split(",").last()
    40. }
    41. }
    42. break
    43. case "men":
    44. if(para.last().indexOf(",")===-1)
    45. {
    46. menue = "menue="+para.last()
    47. }
    48. else
    49. {
    50. if(para.last().split(",").last()=="")
    51. {
    52. menue = "menue="+para.last().split(",").first()
    53. }
    54. else
    55. {
    56. menue = "menue="+para.last().split(",").first()+"&pfad="+para.last().split(",").last()
    57. }
    58. }
    59. break
    60. case "ueb":
    61. if(para.last().indexOf(",")===-1)
    62. {
    63. uebergabe = "id="+para.last()
    64. }
    65. else
    66. {
    67. if(para.last().split(",").last()=="")
    68. {
    69. uebergabe = "id="+para.last().split(",").first()
    70. }
    71. else
    72. {
    73. uebergabe = "id="+para.last().split(",").first()+"&table="+para.last().split(",").last()
    74. }
    75. }
    76. break
    77. case "sup":
    78. superior = true
    79. break
    80. }
    81. }
    82. })
    83. if(location)
    84. {
    85. if(location.indexOf("/")===-1)
    86. {
    87. var url = "../"+location+"/"+location+".php"
    88. }
    89. else
    90. {
    91. var url = "../"+location+".php"
    92. }
    93. if(uebergabe)
    94. {
    95. url+="?"+uebergabe
    96. }
    97. }
    98. if(url)
    99. {
    100. if(superior===true)
    101. {
    102. //DEBUG->
    103. alert("in superior")
    104. alert(Form.serialize("Form"))
    105. //<-DEBUG
    106. new Ajax.Updater("incontent",url,{
    107. method: 'post',
    108. parameters: Form.serialize("Form"),
    109. //DEBUG->
    110. onFailure: function(){alert("Fehler")},
    111. onLoading: function(){alert("loading")},
    112. onSuccess: function(){alert("geschafft")}
    113. //<-DEBUG
    114. })
    115. }
    116. else
    117. {
    118. new Ajax.Updater("incontent", url, {
    119. method: 'get'
    120. })
    121. }
    122. }
    123. else{alert("Kritischer Fehler! Bitte kontaktieren Sie Mich =)")}
    124. if(menue){url_menue+="?"+menue}
    125. }
    126. if (url_menue){
    127. new Ajax.Updater("menuelinks",url_menue,{
    128. method: 'get'
    129. })}else{
    130. alert("Kritischer Fehler! Bitte kontaktieren Sie Mich =)")}
    131. }}
    Alles anzeigen

    in meiner Funktion habe ich momentan einige debug zeilen (gekennzeichnet)
    Zeile(110) alert("in superior") wird wie gewünscht ausgeführt
    Zeile(111) alert(Form.serialize("Form")) nicht -> ich erwarte einen string als rückgabewert

    ids wie Form und incontent sind überprüft

    ich hoffe das gepostete reicht für eine ausreichende analyse, bei bedarf poste ich gerne auch weitere code details


    edit: viele versuche später habe das problem auf folgende codezeile eingegrenzt:
    parameters: Form.serialize("Form"),

    kann mir bitte jemand sagen wo hierbei mein denkfehler liegt habe diese zeile schon anderswo verwendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OliverBuchmann ()

  • Hi,
    du solltest die Daten übrigens besser als Object Hash, statt als String übergeben: prototypejs.org/api/form/serialize
    As of Prototype 1.5 the preferred form of passing parameters to an Ajax request is with an object hash. This means you should pass true for the optional argument. The old behavior (serializing to string) is kept for backwards-compatibility.


    Aber das tut nichts zum Problem.. wie ist denn die ID des Formulars?
    Ich würds mal probieren mit $('id_des_formulars').serialize()

    Sauber programmiert macht es u.U. aber auch Sinn in den onsubmit Handler einzugreifen und das Formular mit Referenz auf this zu übergeben.
    Weitere Informationen zu dem Vorgehen findest du unter [wiki]Formulare mit AJAX.. und ohne[/wiki]
  • Hi, vielen dank erstmal für die schnelle antwort

    den lösungsansatz mit $('id_des_formulars').serialize()
    habe ich auch schon versucht

    mit dem onsubmit handler habe ich es zuvor probiert ist ebenfalls gescheitert

    das mit hash ist eine gute idee werde ich machen(ist ja nur eine zeile) löst jedoch mein problem nicht :(

    edit:
    so habe nun gänzlich auf eventhandler umgebaut nun ergibt sich jedoch ein problem:

    der eventhandler sieht so aus:

    Quellcode

    1. document.observe('dom:loaded', function () {
    2. // Die Problemabfrage
    3. if($('submitButton')!=null){
    4. alert("SubmitButton vorhanden "+$('submitButton'))
    5. }
    6. else
    7. {
    8. alert("submitButton nicht vorhanden")
    9. }
    10. /*var submitButton = $('submitButton')
    11. Event.observe(submitButton, 'click', function(){
    12. alert("buh")
    13. });*/
    14. // fängt den link ab und führt ein httprequest aus (benögtigt falls javascript deaktiviert)
    15. $$('.directmenuelink').each(function(item) {
    16. Event.observe(item, 'click', function(event){
    17. Event.stop(event);
    18. var href = item.readAttribute('href');
    19. getPage(href);
    20. });
    21. });
    22. // bei klick auf einen Menuelink (ein Menue aus divs deren kinder links sind) wird ein httprequest ausgeführt mit der url des kindes
    23. $$('.menuelink').each(function(item) {
    24. Event.observe(item, 'click', function(event){
    25. var href = item.firstChild.href
    26. getPage(href);
    27. });
    28. });
    29. });
    Alles anzeigen


    wenn ich die seite aufrufe bekommte ich wie gewünscht
    alert("submitButton nicht vorhanden")
    da dieser Button noch nicht vorhanden ist

    nun lade ich in einem div mittels ajax ein formuar, dort gibt es so ein element mit der id('submitButton')
    die abfrage ob es diese gibt wird jedoch nicht mehr gestartet.
    kann ich das event dom:loaded irgendwie reloaden oder so

    warum ich diese abfrage brauche und nicht einfach ein event.observe mache?
    durch das nicht vorhandensein des elements mit der id "submitButton" bricht mein script ab und die restlichen events werden nicht abgefragt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von OliverBuchmann2 ()