Подтвердить что ты не робот

Рекомендации по обмену правилами валидации между Javascript и PHP?

Мы в процессе написания новой формы, которую наш интерфейсный кодер включил много и много проверки JavaScript (технически, проверка JQuery Tools).

Я пишу часть сервера на стороне сервера PHP, и, конечно же, мой собственный код будет выполнять свою собственную проверку полученных данных.

Вместо того, чтобы поддерживать два набора правил проверки - jQuery и PHP - есть ли у вас какие-либо рекомендации относительно способа создания центрального списка правил проверки, то есть поле X должно быть размером > 1 и < 10 и т.д. - так что я могу изменить правило проверки в отдельной таблице файлов или базы данных, которая затем будет передана как PHP, так и jQuery?

Например, измените то же самое правило, о котором я упоминал выше, поле X должно быть размером > 1 и < 10 "в" поле X должно быть размером > 3 и < 5 ", и все, что мне нужно было бы сделать, это отредактировать файла или базы данных, и как PHP, так и jQuery будут получать и анализировать эти данные соответственно?

Заранее благодарим за помощь,

Фил

4b9b3361

Ответ 1

Что-то вроде этих строк, вероятно, будет хорошо:

<?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

Nette framework делает следующее: http://doc.nette.org/en/forms

Вся форма и правила проверки определены в файле PHP. Затем структура генерирует HTML-код с проверкой JavaScript и после его отправки выполняет проверку на стороне сервера.

Вы даже можете использовать часть Forms в структуре отдельно.