Hi, You must have checked this, but... Are you _absolutely_ sure that bookFormHandler() is being called at all? It sounds like it's just not hooked up. Have you walked through the code with Firebug?
FWIW... -- T.J. Crowder tj / crowder software / com Independent Software Engineer, consulting services available On Feb 18, 5:07 pm, Chris Sansom <[email protected]> wrote: > Hello > > First a bit about me and my setup. I'm an entirely self-taught (the > worst kind, I'm sure!) JavaScript, PHP and MySQL developer. I have a > PowerMac G5 with Apache running on it purely for local development > purposes, after which the code's all uploaded to a shared Linux host. > I use the Prototype library but not, so far, script.aculo.us (maybe I > should look into that). > > I should also say that my understanding of Ajax is, erm, a little > hazy, but I have made it work very nicely with the help of > Prototype... until now. > > So, my current problem. I'm working on a CMS for a client which > involves a large-ish form via which they add information to their > MySQL database. There are three points in the form where a smaller > form can be called up, via JS, into a 'lightbox' (like a popup but > not a popup) so they can enter subsidiary data which goes into the > database via Ajax and updates a <select> or whatever in the main > form. At the end of each JS function that does the Ajax there's a > 'return false;' to prevent the form data being sent in the > traditional manner and calling the main script. > > I've made this work perfectly in a couple of places, but in the third > case the 'return false;' is being ignored, the form is being sent in > the traditional way and of course the whole thing falls over because > the data is not what the main script expects. But... apart from the > details, the way this works is identical to the two which work > perfectly well, so I've hit an impasse. > > The functions that work (with the irrelevant parts taken out): > > ============ > > // handle form for recording a new event venue and adding it to a <select> > function venFormHandler() { > var pars = 'venue=' + encodeURIComponent ($F('venue')) + > '&cityid=' + $F('cityid'); > if ($F('url').match (/\w/)) { > pars += '&url=' + encodeURIComponent ($F('url')); > } > if ($F('address').match (/\w/)) { > pars += '&address=' + encodeURIComponent ($F('address')); > } > if ($F('postcode').match (/\w/)) { > pars += '&postcode=' + encodeURIComponent ($F('postcode')); > } > > var url = base + 'ajaxnewvenue'; > > // send request to do the business > var myAjax = new Ajax.Request ( > url, > { > method: 'post', > parameters: pars, > onSuccess: function (req) { > // get new venue id from returned xml > var xml = req.responseXML; > var newvenid = > xml.getElementsByTagName('newvenid')[0].firstChild.nodeValue; > > if (newvenid) { > // get new venue info from returned > xml > // and do the necessary to put it in > the <select> > } > else { > alert ('Unable to add new venue to > database.'); > } > $('newvenmsg').style.display = 'none'; > }, > onFailure: function() { > alert ('Unable to add new venue - script > failure.'); > } > } > ); > > return false; > > } > > As you can see, this calls the script ajaxnewvenue.php (I always use > multiViews, hence no file extension), and this works like a charm. As > does: > > ============ > > // handle form for recording a new speaker and adding him/her to a <select> > function spkrFormHandler() { > var pars = 'surname=' + encodeURIComponent ($F('surname')); > if ($F('sptitle').match (/\w/)) { > pars += '&title=' + encodeURIComponent ($F('sptitle')); > } > if ($F('forename').match (/\w/)) { > pars += '&forename=' + encodeURIComponent ($F('forename')); > } > if ($F('suffix').match (/\w/)) { > pars += '&suffix=' + encodeURIComponent ($F('suffix')); > } > if ($F('urls').match (/\w/)) { > pars += '&urls=' + encodeURIComponent ($F('urls')); > } > > var url = base + 'ajaxnewspeaker'; > > // send request to do the business > var myAjax = new Ajax.Request ( > url, > { > method: 'post', > parameters: pars, > onSuccess: function (req) { > var xml = req.responseXML; > // get new speaker id from returned xml > var newspkrid = > xml.getElementsByTagName('newspkrid')[0].firstChild.nodeValue; > > // new speaker has been added > if (newspkrid > 0) { > // get info and add to several > <select>s > } > > // duplicate found (script returns -1 if so) > else if (newspkrid < 0) { > // confirm or reject duplicate > var yesnew = confirm ('There is > already a ' + > name + ' in the database.\nClick OK to add a new ' + name + ' or > Cancel to use the existing one.'); > > // add new one (further ajax call) > if (yesnew) { > url = base + > 'ajaxnewspeakernocheck'; > var myAjax = new Ajax.Request > ( > url, > { > method: > 'post', > parameters: > pars, > onSuccess: > function (req) { > var > xml = req.responseXML; > // > get new speaker id from returned xml > var > newspkrid = > xml.getElementsByTagName('newspkrid')[0].firstChild.nodeValue; > > // > new speaker has been added > if > (newspkrid > 0) { > > // get info and add to > several <select>s > } > // or > not > else { > > alert ('Unable to add new > speaker to database.'); > } > }, > onFailure: > function() { > alert > ('Unable to add new speaker > - script failure.'); > } > } > ); > } > > // use existing > else { > // select the existing name > in the <select> > } > } > else { > alert ('Unable to add new speaker to > database.'); > } > }, > onFailure: function() { > alert ('Unable to add new speaker - script > failure.'); > } > } > ); > > return false; > > } > > This calls ajaxnewspeaker.php and, if a duplicate is found which the > user accepts (two people can have the same name!), > ajaxnewspeakernocheck.php - and this all works fine and dandy. > However... > > ============ > > // handle form for recording a new book and adding a new field to the > main form function bookFormHandler() { > var pars = 'title=' + encodeURIComponent ($F('btitle')); > if ($F('isbn').match (/\w/)) { > pars += '&isbn=' + encodeURIComponent ($F('isbn')); > } > if ($F('publisher').match (/\w/)) { > pars += '&publisher=' + encodeURIComponent ($F('publisher')); > } > if ($F('rrp').match (/\w/)) { > pars += '&rrp=' + encodeURIComponent ($F('rrp')); > } > // complicated stuff about authors omitted here, but trust me, it > still doesn't work without it! > > var url = base + 'ajaxnewbook'; > > // send request to do the business > var myAjax = new Ajax.Request ( > url, > { > method: 'post', > parameters: pars, > onSuccess: function (req) { > var xml = req.responseXML; > // get new book id from returned xml > var newbookid = > xml.getElementsByTagName('newbookid')[0].firstChild.nodeValue; > > // new book has been added > if (newbookid > 0) { > // get info and insert new field in > form > } > > // duplicate found (-1 returned) > else if (newbookid < 0) { > // alert about duplication > alert ('There is already a book in > the database > with this ISBN.\nTo make changes to this book, use the Manage Books > page.'); > } > > // db failure > else { > alert ('Unable to add new book to > database.'); > } > }, > onFailure: function() { > alert ('Unable to add new book - script > failure.'); > } > } > ); > > return false; > > } > > I know this makes the correct query string and url for > ajaxnewbook.php, but it simply isn't getting as far as calling that > script. There's no sign of it in my access logs and the Firefox > LiveHTTPHeaders extension shows that it calls the main script > (admin.php) - so for some reason 'return false' isn't working. The > other thing that's clear from LiveHTTPHeaders is that the query > string is definitely as read straight from the form fields, rather > than after the necessary JS processing that's done to it (that > 'complicated stuff' I took out) before calling the Ajax. > > But what the heck is the difference from the two functions that work? > Sure, there's plenty of difference in the details of the processing > it does, but even if I comment all that out and reduce it to: > > var myAjax = new Ajax.Request ( > url, > { > method: 'post' > } > ); > ... and set ajaxnewbook.php to write something in a file, it /still/ > fails and calls admin.php. > > And for what it's worth, the forms that trigger these functions - > which are very small and simple - are identical apart from the > necessary name changes and the details of the data fields themselves. > > Oh, and I get no errors of any sort reported! > > I'm tearing the remains of my hair out here, so any clues would be > more than welcome. > > -- > Cheers... Chris > Highway 57 Web Development --http://highway57.co.uk/ > > Mac users swear by their computers. > PC users swear at their computers. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Prototype & script.aculo.us" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/prototype-scriptaculous?hl=en -~----------~----~----~----~------~----~------~--~---
