Hi,
I have a form which when submitted is supposed to trigger an update via Ajax. I can handle the backend part, my question is how do I submit form values to Ajax without causing a page refresh?
Greetings/Thanks
R
Watch
GitHub Core
Show your support for Zikula! Sign up at Github account and watch the Core project!
GitHub Modules
- craigh responded to »Using PageUtil::addVar() to load script code« 03:29 PM
- michiel responded to »password problem« 10:01 AM
- mazdev responded to »Hide "Register new account" and change template to 3 col« 07:50 AM
- mesteele101 created topic »Zikula 1.3.3 - Site Search 1.5.2 - Unable to turn off plug-ins« 07:48 AM
- mesteele101 responded to »ERR (3): E_USER_ERROR: Smarty error: [in pagesvar:pagesitem2en line XXX]…« 25. May
- mazdev responded to »Pages 2.5.0 and updating - Page not found« 25. May
- mesteele101 responded to »Zikula 1.3.3 - Selecting a category in Pages not working« 25. May
Zikula Blog
- Anatomy of Open Source Projects on Mar 07
- Continuous Review on Mar 01
- Not Invented Here on Feb 24
- How to Contribute Your Code at Github on Jan 13
- 10 Steps to Coding-Nirvana: Tips for Successful Module Writing on Nov 12
- Submitting Bug Report Tickets That Get Results on Aug 17
- Cozi Tricks #1: Syntax Highlighting on Aug 07
Login
How to submit a form using Ajax?
-
- Rank: Team Member
- Registered: Jan 05, 2003
- Last visit: May 28, 2010
- Posts: 776
-
- Rank: Team Member
- Registered: Apr 07, 2005
- Last visit: Jan 18, 2010
- Posts: 228
So if you have form - you need to bind js observer which will catch submit event and proceed submission via Ajax.
Example:
Code
<form id="myform" method="post" ... >
...
</form>
$('myform').observe('submit',submitHandler);
function submitHandler(event) {
event.preventDefault(); // this stops default event execution - so form wont be send in normal way
var form = e.findElement('form'); // find form element in event handler, if this function is used for one form do it simple: vaf form = $('myform');
var pars = form.serialize(); // get form values
new Zikula.Ajax.Request("ajax.php?module=foo&func=bar", {
method: 'post',
parameters: pars,
onComplete: youCompleteRequestHandler
});
}
Edit - script tags where striped by Dizkus... So just remember to pust js code inside script tag
Edited by Jusuff on Mar 02, 2011 - 03:46 AM.
--
Polish Zikula Team
Bianor Works - my Zikula works on CoZi -
- Rank: Team Member
- Registered: Jan 05, 2003
- Last visit: May 28, 2010
- Posts: 776
-
- Rank: Developer
- Registered: Sep 22, 2005
- Last visit: May 20, 2010
- Posts: 292
One thing: Ideally the javascript should be in a separate .js file , and included with the pnajaxheader plugin.
That is, for 1.2.x at least, I'm sure 1.3 renames everything.
Edited by ccandreva on Mar 02, 2011 - 03:04 PM. -
- Rank: Team Member
- Registered: Apr 07, 2005
- Last visit: Jan 18, 2010
- Posts: 228
Yes, you're right. This was just fast example :)
And in 1.3 pnajaxheader was renamed to ajaxheader.
--
Polish Zikula Team
Bianor Works - my Zikula works on CoZi -
- Rank: Team Member
- Registered: Jan 05, 2003
- Last visit: May 28, 2010
- Posts: 776
Hi Jusuff,
I would need 1 more piece of help/advice please. On my page, I have multiple forms (I in advance know the name/id of the forms). How would I change the submitHandler() function to accept a parameter which tells it the name/id of the form and how would I then change the calling code to reflect this?
Yes, I am rather incompetent when it comes to JS
Greetings/Thanks
Robert -
- Rank: Team Member
- Registered: Apr 07, 2005
- Last visit: Jan 18, 2010
- Posts: 228
The example code I've posted above contains what you need :)
Take a look at:
Code
var form = e.findElement('form');
This way "form" refers to form element, which was submitted. If you need directly it's ID attribute, just get it:
Code
formId = form.id;
or even:
Code
var formId = e.findElement('form').id;
Edited by Jusuff on Mar 08, 2011 - 02:17 AM.
--
Polish Zikula Team
Bianor Works - my Zikula works on CoZi -
- Rank: Team Member
- Registered: Apr 07, 2005
- Last visit: Jan 18, 2010
- Posts: 228
Igor - I'm not sure what you want achieve...
--
Polish Zikula Team
Bianor Works - my Zikula works on CoZi -
- Rank: Team Member
- Registered: Jan 05, 2003
- Last visit: May 28, 2010
- Posts: 776
Hi Jusuff,
thanks very much for your help, I got things to work using the following code:
Code
function submitHandler(event) {
event.preventDefault();
var form = event.findElement('form');
var formID = form.id;
var pars = form.serialize();
/* DEBUG
var str = '';
var elem = form.elements;
for(var i = 0; i < elem.length; i++)
{
str += "Type:" + elem[i].type + " ";
str += "Name:" + elem[i].name + " ";
str += "Value:" + elem[i].value + "";
str += "\n";
}
alert (str);
*/
var skuArray = [];
for(var i=0; i<5; i++) {
if (typeof form["sku_array["+i+"]"] != 'undefined') {
skuArray[i] = form["sku_array["+i+"]"].value;
}
}
//alert (skuArray);
show_data(form.product_id.value, skuArray, form.qty.value);
}
Greetings/Thanks
Robert -
- Rank: Team Member
- Registered: Jan 05, 2003
- Last visit: May 28, 2010
- Posts: 776
Actually, I just discovered something interesting/mysterious. The following code:
Code
function add_response(req)
{
if (req.status != 200 ) {
pnshowajaxerror(req.responseText);
return;
}
var json = pndejsonize(req.responseText);
for(var i=0; i<25; i++) {
$('line_' + i).style.display = 'none';
}
for(var i=0; i<json.totalItems; i++) {
$('name_' + i).innerHTML = json.lines[i].name;
$('qty_' + i).innerHTML = json.lines[i].qty;
$('link_' + i).href = json.lines[i].href;
$('line_' + i).style.display = '';
}
$('totalCost').innerHTML = json.totalCost;
$('totalItems').innerHTML = json.totalItems;
}
under some conditions (which I don't quite understand yet) never reaches the last 2 statements but (and here it gets interesting) the Error console shows no errors and I know that I have more than json.totalItems elements (which are processed in the loop) defined in my HTML page.
Any ideas? Any tips on how to debug this?
Greetings/Thanks
R
- Moderated by:
- Support
