2012-04-16 7 views
13

フロントエンドのコーダーに多数のJavaScript検証(技術的にはjQueryツールの検証)が含まれた新しいフォームを作成しています。JavascriptとPHP間の検証ルールの共有に関する推奨事項

私はプロセスのPHPサーバー側部分を書いていますが、もちろん、自分のコードは受信したデータの独自の検証を実行します。

jQueryとPHPの2組の検証ルールを維持するのではなく、検証ルールの中央リストを作成する方法についての推奨事項があります。つまり、フィールドXはサイズ> 1で、<です。などです。そのため、単一のファイルまたはデータベーステーブルで検証ルールを変更すると、PHPとjQueryの両方に渡されます。

たとえば、上記の「フィールドXはサイズ> 1で、< 10」から「フィールドXはサイズ> 3、< 5」に変更してください。ファイルを編集するだけですPHPとjQueryの両方がそれに応じてデータを取得して解析するでしょうか?あなたの助けを事前に

おかげで、

フィル

+0

あなたはどのようなサイトを作成しましたかjQueryがデータベースからデータを読み取ることができないので、ファイルやデータベースを使用して実際にルールを共有できないような高度な検証が必要だと思うのはなぜですか?なぜあなたはそれをやるべきではないのか分かりません。もう1つは、xmlを使用して検証ルールを格納することです。 –

+0

これはNodeJSが本当に輝く別のエリアです。 – AlienWebguy

+0

ルールを含むデータベースで簡単な検証ルール(電子メール、最大長、必須など)を抽象化することは非常に簡単ですが、別のフィールドの内容、現在のユーザー、またはシステム内の他のオブジェクトは、かなり複雑です。膨大な量の検証ロジックがない限り、PHPとjQueryの両方で手動でロジックをコーディングするだけです。 –

答えて

4

これらの線に沿って何かがおそらく良いでしょう:

<?php 
$validation = Array(
    "field1" => Array(// "field1" is the name of the input field 
     "required" => true, // or false 
     "minlength" => 5, // use 0 for no minimum 
     "maxlength" => 10, // use 9999 (or other high number) for no maximum 
     "regex" => "^[a-zA-Z0-9]+$" // use empty string for no regex 
    ), 
    "field2" => ....... 
    .... 
); 
if($_POST) { 
    foreach($validation as $k=>$v) { 
     if(!isset($_POST[$k])) { 
      if($v['required']) die("Field ".$k." is required"); 
     } 
     else { 
      $l = strlen($_POST[$k]); 
      if($l < $v['minlength']) die("Field ".$k." too short"); 
      if($l > $v['maxlength']) die("Field ".$k." too long"); 
      if(!preg_match("(".$v['regex'].")",$_POST[$k])) die("Field ".$k." incorrect format"); 
     } 
    } 
    // all ok! 
} 
?> 
<script type="text/javascript"> 
    (function(rules) { 
     var die = function(str) {alert(str); return false;}; 
     document.getElementById('myForm').onsubmit = function() { 
      var elms = this.elements, i, it, r, s; 
      for(i in rules) { 
       r = rules[i]; 
       it = elms.namedItem(i); 
       if(typeof it == "undefined") { 
        if(r.required) return die("Field "+i+" is required"); 
       } 
       else { 
        s = it.length; 
        if(s < r.minlength) return die("Field "+i+" too short"); 
        if(s > r.maxlength) return die("Field "+i+" too short"); 
        if(!s.match(new RegExp(r.regex))) return die("Field "+i+" incorrect format"); 
       } 
      } 
      return true; 
     }; 
    })(<?=json_encode($validation)?>); 
</script> 

は、あなたが見ることができるように、一般的な考え方は、セットを定義することですルールでは、魔法はjson_encode($validation)で起こります。これにより、ルールがJavaScript環境に渡されます。 PHPとJSで動作させるためには、検証コードを複製する必要がありますが、少なくとも2つの場所でコードを変更することなく、より多くのルールを追加することができます。お役に立てれば! http://doc.nette.org/en/forms

全体の形や検証ルールはPHPファイルで定義されています。

+0

ありがとう、私はこれを好む - 私はこれを試してみるつもりです:) – PhilGA

3

Nette frameworkはこれを行います。その後、フレームワークはJavaScriptの検証でHTMLコードを生成し、送信後にサーバー側の検証を実行します。

フレームワークのフォーム部分を別途使用することもできます。

+0

@ondrataこんにちは、Netteは、我々はバックエンドに使用しているものであるZendの、に似ています。しかし、Zend Formの使用は避けています。なぜなら、Zend Formはレイアウトに苦労し、非常に複雑なレイアウトです。 – PhilGA

+0

@PhilAG:Netteはもう少し軽量Zendのよりなので、おそらくいくつかのフィッティングツール(私は賢明にチェックし、おそらく書き込み、独自のローリングはオプションであってもよいが、フィッティングツールは、あなた自身をrolllingよりも優れているかもしれません)。これは、レイアウトであなたを助けることができる – hakre

+1

@PhilAG:http://doc.nette.org/en/forms#toc-manual-rendering基本的には、あなたがコントロールの周りにHTMLを書いて、Netteは年代(と

)を生成します。 –

関連する問題