yii表单重复提交
今天碰到一个表单因为网速不好 可能误操作多次点击重复提交的问题
随便百度了一下有的说用
[php]$this->refresh();[/php]
试了试没什么用处,也可能是我没写对。
所以自己思考了下,防止重复提交可以从前台和后台入手
后台:
判断这次提交是不是和上次提交一样,如果一样则返回不予处理。
或者对每个表单分配一个唯一的id并存入session ,提交的时候把id一并提交,如果传过来的值和session不一样则返回,如果相同则更改session。这样使表单只提交一次。
前台:
用js控制表单,表单提交过就不允许再提交,或者禁用提交按钮。
有了思路就开始写代码
原来的代码是用的CActiveForm生成的表单代码如下
[php]
$form = $this->beginWidget(‘CActiveForm’, array(
‘id’ => ‘visit-form’,
‘enableAjaxValidation’ => true,
‘clientOptions’ => array(
‘validateOnSubmit’ => true,),
‘action’ => ‘/users/create_visit’,
‘htmlOptions’ => array(‘class’ => ‘form-horizontal form-bordered’),
));
[/php]
于是我准备从前台入手,搜了一下CActiveForm
传递给JavaScript验证插件的选项数组。 目前支持下列选项:
-
ajaxVar: string, 用来指明当前请求是一个AJAX请求的参数的名字。 当AJAX验证被触发,一个以此属性值为名的参数将与其他表单数据一起被提 交到服务器。此参数的值是表单的ID。 服务器端可以检测出AJAX验证的触发者,并作出相应的反应。 默认值是“ajax”。
-
validationUrl: string, 用于执行AJAX验证的URL。 如果没有设置,将使用action的值。
-
validationDelay: integer, 输入被改变后延迟多少时间才执行 AJAX验证,单位是毫秒。设置为0意味着输入被改变后将立即执行AJAX 验证。设置为大于0的值意味着多个输入改变可能只触发一次AJAX验证, 只要它们发生得足够快。这种方式可以帮助降低服务器负荷。 默认值是200(0.2秒)。
-
validateOnSubmit: boolean, 当表单被提交时是否执行AJAX验证。 如果存在任何验证错误,表单的提交动作将被停止。 默认值是false。
-
validateOnChange: boolean, 是否每次输入值被改变都触发 一次AJAX验证。因为每次AJAX验证请求都会提交整个表单的数据, 可能会导致过多的影响性能,你可以选择关闭此选项。 默认值是true。
-
validateOnType: boolean, 是否用户的每次按键动作都会触 发一次AJAX验证。如果该属性设置为true,你应该增大“validationDelay” 的值以避免触发太多的AJAX验证。默认值是false。
-
hideErrorMessage: boolean, 当存在错误时是否隐藏错误提示信息。 默认值是false,表示无论是否存在输入错误,都会显示错误信息。
-
inputContainer: string, 包含输入框的HTML元素的jQuery选择器。 在验证处理过程中,CActiveForm将为包含元素指定相应的CSS类以指示状 的改变。如果没有设置,默认是指包含输入框的最近的“div”元素。
-
errorCssClass: string, 为包含有AJAX验证错误的输入框的HTML容器 指定的CSS类。默认值是“error”。
-
successCssClass: string, 为包含通过了AJAX验证成功的输入框的HTML 容器指定的CSS类。默认值是“success”。
-
validatingCssClass: string, 为包含正在进行AJAX验证的输入框的 HTML容器指定的CSS类。默认值是“validating”。
-
errorMessageCssClass: string, 为AJAX验证返回的错误提示信息 指定的CSS类。默认值是“errorMessage”。
-
beforeValidate: function, 在一个表单提交动作触发的基于AJAX的 验证执行之前被调用的函数(仅当validateOnSubmit设置为true时可用)。 预期的函数签名形如
beforeValidate(form) {...},这儿“form” 是form对象的jQuery表示。如果此函数的返回值不为true,验证将会被取 消。注意:因为此选项指向一个JavaScript函数,你应该为它增加一个“js:”前缀, 以避免它被作为一个字符串编码。此选项从1.1.3版开始被支持。 -
afterValidate: function, 在一个表单提交动作触发的基于AJAX的 验证执行之后被调用的函数(仅当validateOnSubmit设置为true时可用)。 预期的函数签名形如
afterValidate(form, data, hasError) {...}, 这儿“form”是form对象的jQuery表示;“data”是服务器端验证响应的JSON格式的数据; “hasError”是一个布尔值,它指示是否存在任何验证错误。如果此函数的返回值不是true, 相应的表单提交将会被取消。注意:因为此选项指向一个JavaScript函数,你应该为它增加一个“js:”前缀, 以避免它被作为一个字符串编码。此选项从1.1.3版开始被支持。 -
beforeValidateAttribute: function, 当一个单独的属性的输入框 发生改变时触发的AJAX验证执行之前被调用的函数。预期的函数签名形如
beforeValidateAttribute(form, attribute) {...}, 这儿“form”是form对象的jQuery表示;“attribute”指向触发的属性的js选项(参见error)。 如果此函数的返回值不为true,验证将会被取消。注意:因为此选项指向一个JavaScript函数,你应该为它增加一个“js:”前缀, 以避免它被作为一个字符串编码。此选项从1.1.3版开始被支持。 -
afterValidateAttribute: function, 当一个单独的属性的输入框 发生改变时触发的AJAX验证执行之后被调用的函数。预期的函数签名形如
afterValidateAttribute(form, attribute, data, hasError) {...}, 这儿“form”是form对象的jQuery表示; “attribute”指向触发的属性的js选项 (参见error); “data”是服务器端验证响应的JSON格式的数据;“hasError”是一个布尔值, 它指示是否存在任何验证错误。注意:因为此选项指向一个JavaScript函数,你应该为它增加一个“js:”前缀, 以避免它被作为一个字符串编码。此选项从1.1.3版开始被支持。
上述的部分选项可能被个体的error()调用覆盖。 这部分选项包括:validationDelay,validateOnChange,validateOnType,hideErrorMessage, inputContainer,errorCssClass,successCssClass,validatingCssClass,beforeValidateAttribute,afterValidateAttribute。
发现afterValidate这个参数可以利用,
afterValidate: function, 在一个表单提交动作触发的基于AJAX的 验证执行之后被调用的函数(仅当validateOnSubmit设置为true时可用)。 预期的函数签名形如afterValidate(form, data, hasError) {...}, 这儿“form”是form对象的jQuery表示;“data”是服务器端验证响应的JSON格式的数据; “hasError”是一个布尔值,它指示是否存在任何验证错误。如果此函数的返回值不是true, 相应的表单提交将会被取消。
ajax验证过后就是提交了, 我只要在表单提交前判断是不是提交过就行了。
开工
[php]
$form = $this->beginWidget(‘CActiveForm’, array(
‘id’ => ‘visit-form’,
‘enableAjaxValidation’ => true,
‘clientOptions’ => array(
‘afterValidate’=>"js:function(form, attribute, hasError){
if(hasError){
}else{
if(subattribute==form.serialize()){
}else{
subattribute=form.serialize();
return true;
}
}
}",
‘validateOnSubmit’ => true,),
‘action’ => ‘/users/create_visit’,
‘htmlOptions’ => array(‘class’ => ‘form-horizontal form-bordered’),
));
[/php]
[php]
<script type="text/javascript">
var subattribute = ”;
</script>
[/php]