所以我在Yii的模型中有这些规则:
array('svalue','numerical'),
由于这些是数字(后来它们将用于计算), 我想把它保存为数字。
客户端虽然要求数字格式化为逗号','分隔符为数千(1,200 =千二百)。我的前任项目使用了
$.fn.digits = function(){
return this.each(function(){
$(this).keyup(function(){
$(this).val( $(this).val().replace(/,/g,"").replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") );
});
})
}
我添加了keydown功能,这样你就不能放任何其他字符而不是数字。
不幸的是,现在,jquery.digits()函数正确地将任意数字格式化为数千个 - 但是yii显然生成了一些代码,然后在表单验证上它说 “svalue必须是一个数字”。
如何拥有这两个函数,拥有客户想要的格式化字符串,并对Yii后端进行数字检查?
答案 0 :(得分:0)
在验证模型之前,只需将其转换为数字即可。所以你应该在创建和更新操作中有这样的东西:
$model->attributes=$_POST['Model'];
$model->number = floatval($model->number); //or intval if it is an integer.
$model->save(); //or $model->validate();
然后在显示数字时再添加逗号。
或者你可以创建自己的验证函数,允许数字,逗号和小数。并使用它而不是内置的numeric
验证。
答案 1 :(得分:0)
在保存或验证模型之前使用str_replace
:
在模特的beforeValidate()
中:
protected function beforeValidate() {
if(parent::beforeValidate) {
$this->svalue = str_replace(',', '', $this->svalue);
return true;
}
return false;
}
或者在控制器的保存和更新操作中:
$model->attributes = $_POST['Modelname'];
$model->svalue = str_replace(',', '', $model->svalue);
但最好的方法是在客户端(实际上是 view 文件)本身,在表单提交之前将值更改回数字,并且无论何时显示表单,添加逗号。
显示表单时,为已存储的值添加逗号(更新方案或部分验证的方案):
$("#field").val( $("#field").val().replace(/,/g,"").replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,") );
对于新输入的值,您已经有了添加逗号的功能。
然后在提交表单之前,将值更改为不带逗号的值:
$("#form-selector").submit(function(){
$("#field").val( $("#field").val().replace(/,/g,"") );
return true; // let the form submit
});
由于这纯粹是一种演示改变,我认为操作应该在客户端。