0

だから私はYiiのモデルにこれらのルールを持っています:

array('svalue','numerical'),

これらは数値なので(後で計算に使用されます)、数値として保存したいと思います。

ただし、クライアントは、数値をコンマ「,」区切り文字 (1,200 = 千 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,") );
        });
    })
}

また、キーダウン機能を追加して、数字以外の文字を入力できないようにしました。

残念なことに、jquery.digits() 関数は任意の数を千単位で正しくフォーマットしますが、yii は明らかにいくつかのコードを生成し、フォーム検証で「svalue は数値でなければなりません」と表示されます。

クライアントが望むようにフォーマットされた文字列を持ち、Yii バックエンドで数値チェックを行うには、どうすれば両方の機能を持たせることができますか?

4

2 に答える 2

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);

ただし、これを行う最善の方法は、クライアント側 (実際にはファイルを表示する) 自体で、フォームを送信する前に値を数値に戻し、フォームが表示されるたびにコンマを追加することです。

フォームが表示されたら、既に保存されている値にコンマを追加します (更新シナリオまたは部分的に検証されたシナリオ)。

$("#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
});

これは純粋にプレゼンテーションの変更であるため、操作はクライアント側で行う必要があると思います。

于 2012-11-02T20:58:54.413 に答える
0

モデルを検証する前に、モデルを数値に変換するだけです。したがって、作成および更新アクションには次のようなものが必要です。

$model->attributes=$_POST['Model'];
$model->number = floatval($model->number); //or intval if it is an integer.
$model->save(); //or $model->validate();

次に、数値を表示するときにカンマを追加します。

または、数字、カンマ、および小数を許可する独自の検証関数を作成することもできます。そして、組み込みのnumeric検証の代わりにそれを使用してください。

于 2012-11-02T17:13:50.793 に答える