我正在尝试修改Joomla组件,以实现一些ajax功能,从而为我的网站用户简化一些工作。我更改了下面的信息以保持项目的匿名性,因为我有妄想症:-)
我想实现的目标很简单:
->用户登录xyz组件中的"订单"页面
->如果订单页面上没有该用户的交货地址,请提供创建一个的链接
->当用户单击"添加地址"时,会出现一个模式窗口,并向具有添加地址表单的"addaddress"页面发出ajax请求
->Modal不显示整个页面,而是只显示表单和基本(必需)表单字段
->用户输入地址信息并点击按钮提交表格。
->验证字段,然后发布
->模式关闭
->在原始"订单"页面上具有交货地址的字段将被刷新,现在包括新地址。这不应该刷新整个页面,因为用户可能已经将数据放入其他表单元素中。这很重要。
好吧,现在你知道我想要实现什么了,让我向你介绍一下我现在拥有的。
->用户登录xyz组件中的"订单"页面
->如果订单页面上没有该用户的交货地址,请提供创建一个的链接
我写了一个简单的php-if语句,它创建了一个锚链接,文本为"Add an address"和id为"addNewAddress"
->当用户单击"添加地址"时,会出现一个模式窗口,并向具有添加地址表单的"addaddress"页面发出ajax请求
我正在使用一个名为SimpleModal
的mootools插件http://simplemodal.plasm.it
->Modal不显示整个页面,而是只显示表单和基本(必需)表单字段
我扩展了模态的功能,允许我注入一些mootools过滤,因为我只想显示表单,而不想显示其他内容。我已经将其添加为一个名为getSomething
的新参数,如果需要,我可以注入它
//SIMPLEMODAL
$("addNewAddress").addEvent("click", function(){
var SM = new SimpleModal({"width":600});
SM.addButton("Action button", "btn primary", function(){
$('addressForm').submit();
this.hide();
});
SM.addButton("Cancel", "btn");
SM.show({
"model":"modal-ajax",
"title":"New address",
"param":{
"url":"index.php?option=com_address&modal=true",
"getSomething":"#addressForm",
"onRequestComplete": function(){}
}
});
});
这就是它调用的函数:
else if (param.getSomething.match(elid))
{
// Request HTML
this.request = new Request.HTML({
evalScripts:false,
url: param.url,
method: 'get',
onRequest: function(){},
onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript){
var f = responseElements.filter(param.getSomething);
$('simple-modal').removeClass("loading");
$('simple-modal').getElement(".contents").adopt(f);
param.onRequestComplete();
// Execute script page loaded
eval(responseJavaScript)
// Resize
this._display();
// Add Esc Behaviour
this._addEscBehaviour();
}.bind(this),
onFailure: function(){
$('simple-modal').removeClass("loading");
$('simple-modal').getElement(".contents").set("html", "loading failed")
}
}).send();
}
*现在,到目前为止,我已经设法开始工作,但我不知道下一部分*
->用户输入地址信息并点击按钮提交表格。
在ajax请求url的末尾,您可能会注意到我发送了modal=true请求,这样我就可以隐藏表单上不需要在模态窗口中显示的某些元素——从模态调用表单时,表单自己的提交按钮是隐藏的。
->验证字段,然后发布
如果我在没有模态的情况下调用"addaddress"页面,则表单有自己的验证。然而,使用模态时,当我单击提交时,不会发生任何验证,并且在没有任何验证的情况下添加地址。我需要使用模态本身中的独立验证来实现对字段的一些验证。
->模式关闭
目前,当表格发布时,我会被重定向到"viewaddresses
"页面,但我相信我可以自己解决这个问题。相反,我只想关闭模态。
->在原始"订单"页面上具有交货地址的字段将被刷新,现在包括新地址。这不应该刷新整个页面,因为用户可能已经将数据放入其他表单元素中。这很重要。
这是不言自明的,但我甚至不确定从哪里开始。
我想我已经尽可能清楚了,但如果你还需要什么,请告诉我。
我真的很感激你能提供的任何帮助。
您可能缺少的是如何触发表单提交。
- 您可以通过以下方式提交表格:
$('myForm').fireEvent('submit');
因此,使用您的示例,我将其中一个模式按钮的代码更改为:
SM.addButton("Submit button", "btn primary", function () {
$('addressForm').fireEvent('submit');
});
在Mootools Form.Validator中,您可以捕获formValidate事件。描述:
formValidate-(函数)在表单验证完成时执行的回调;此函数传递三个参数:布尔值(如果表单通过验证,则为true);形式元素;以及onsubmit事件对象(如果有)(否则,传递未定义)。
我不知道当以程序方式触发提交时,为什么表单不被提交,但无论如何,您可以在这个函数中添加一个新的.submit()
来检查验证器布尔结果。
所以你可以这样做:
new Form.Validator.Inline(myForm, {
onFormValidate: function (bool, element) {
if (bool) {
element.submit();
}
}