• php

    Проверка данных формы на минимальное–максимальное числовое значение при помощи PHP (PEAR.HTML.QuickForm)

    Задача проверки данных полей формы, заполняемой пользователем на веб-сайте, на минимальное–максимальное числовое значение при помощи PHP не представляет из себя большую трудность. Однако, буквально вчера, я столкнулся с тем, что если использовать для работы с формой классы пакета PEAR.HTML.QuickForm, то без самостоятельных доработок возможна только проверка на количество вводимых в поле input символов, а также на то, что символы исключительно числовые.

    Так что же делать, если контролировать нужно также и диапазон значения?

    Предлагаю следующий вариант класса HTML/QuickForm/Rule/Range.php c уже готовыми переделками и доработками:

    /* vim: set expandtab tabstop=4 shiftwidth=4: */
    // +----------------------------------------------------------------------+
    // | PHP version 4.0                                                      |
    // +----------------------------------------------------------------------+
    // | Copyright (c) 1997-2003 The PHP Group                                |
    // +----------------------------------------------------------------------+
    // | This source file is subject to version 2.0 of the PHP license,       |
    // | that is bundled with this package in the file LICENSE, and is        |
    // | available at through the world-wide-web at                           |
    // | http://www.php.net/license/2_02.txt.                                 |
    // | If you did not receive a copy of the PHP license and are unable to   |
    // | obtain it through the world-wide-web, please send a note to          |
    // | license@php.net so we can mail you a copy immediately.               |
    // +----------------------------------------------------------------------+
    // | Authors: Bertrand Mansion <bmansion@mamasam.com>                     |
    // +----------------------------------------------------------------------+
    //
    // $Id: Range.php,v 1.6 2003/11/03 16:08:24 avb Exp $
    require_once('HTML/QuickForm/Rule.php');
    /**
    * Validates values using range comparison
    * @version     1.0
    */
    class HTML_QuickForm_Rule_Range extends HTML_QuickForm_Rule
    {
        /**
         * Validates a value using a range comparison
         *
         * @param     string    $value      Value to be checked
         * @param     mixed     $options    int for single value comparison,
         *                                  array for range
         * @return    boolean   true if value is valid
         * @access    public
         */
        function validate($value, $options)
        {
            $length = strlen($value);
            switch ($this->name) {
                case 'minlength':  return ($length >= $options);
                case 'maxlength':  return ($length <= $options);
                case 'minvalue':   return ($value >= $options);
                case 'maxvalue':   return ($value <= $options);
                case 'rangevalue': return (float($value) >= $options[0] && float($value) <= $options[2]);
                default:           return ($length >= $options[0] && $length <= $options[1]);
            }
        } // end func validate
        /**
         * Generates client-side validation script
         *
         * @param     mixed     $options    int for single value comparison,
         *                                  array for range
         * @return    string
         * @access    public
         */
        function getValidationScript($options = null)
        {
            switch ($this->name) {
                case 'minlength':
                    $test = '{jsVar}.length < '.$options;
                    break;
                case 'maxlength':
                    $test = '{jsVar}.length > '.$options;
                    break;
                case 'minvalue':
                    $test = 'Number{jsVar} < '.$options;
                    break;
                case 'maxvalue':
                    $test = 'Number({jsVar}) > '.$options;
                    break;
                case 'rangevalue':
                    $test = 'Number(({jsVar}) < '.$options[0].' || Number({jsVar}) > '.$options[1].')';
                    break;
                default:
                    $test = '({jsVar}.length < '.$options[0].' || {jsVar}.length > '.$options[1].')';
            }
            return array('', "{jsVar} != '' && {$test}");
        } // end func getValidationScript
    } // end class HTML_QuickForm_Rule_Range
    

    Однако, без регистрации новых правил в классе HTML/QuickForm.php ничего работать не будет (фрагмент класса):

    $GLOBALS['_HTML_QuickForm_registered_rules'] = array(
        'required'      => array('html_quickform_rule_required', 'HTML/QuickForm/Rule/Required.php'),
        'maxlength'     => array('html_quickform_rule_range',    'HTML/QuickForm/Rule/Range.php'),
        'minlength'     => array('html_quickform_rule_range',    'HTML/QuickForm/Rule/Range.php'),
        'minvalue'      => array('html_quickform_rule_range',    'HTML/QuickForm/Rule/Range.php'),
        'maxvalue'      => array('html_quickform_rule_range',    'HTML/QuickForm/Rule/Range.php'),
        'rangevalue'    => array('html_quickform_rule_range',    'HTML/QuickForm/Rule/Range.php'),
        'rangelength'   => array('html_quickform_rule_range',    'HTML/QuickForm/Rule/Range.php'),
        'email'         => array('html_quickform_rule_email',    'HTML/QuickForm/Rule/Email.php'),
        'regex'         => array('html_quickform_rule_regex',    'HTML/QuickForm/Rule/Regex.php'),
        'lettersonly'   => array('html_quickform_rule_regex',    'HTML/QuickForm/Rule/Regex.php'),
        'alphanumeric'  => array('html_quickform_rule_regex',    'HTML/QuickForm/Rule/Regex.php'),
        'numeric'       => array('html_quickform_rule_regex',    'HTML/QuickForm/Rule/Regex.php'),
        'nopunctuation' => array('html_quickform_rule_regex',    'HTML/QuickForm/Rule/Regex.php'),
        'nonzero'       => array('html_quickform_rule_regex',    'HTML/QuickForm/Rule/Regex.php'),
        'callback'      => array('html_quickform_rule_callback', 'HTML/QuickForm/Rule/Callback.php'),
        'compare'       => array('html_quickform_rule_compare',  'HTML/QuickForm/Rule/Compare.php')
    );
    

    И вот теперь проверка на значение может быть выполнена легко и просто, как это всегда и делается в PEAR.HTML.QuickForm:

    $form->addRule('valuefield', 'значение должно быть не меньше 100', 'minvalue', 100);

    Удачи!

    Опубликовано: Категория: phpКомментарии: 2

    Комментарии (оставить комментарий)

    Комментарий
    Миша К.

    Спасибо, попользуем! ;)

    Ответить

    02.01.2007

    Комментарий
    tobto

    неплохое решение

    Ответить

    25.01.2007

    Оставьте свой комментарий

    Ваше имя: Email: Оставьте свой email, если хотите получать уведомления о комментариях на этой странице. Ваш email не будет опубликован на сайте.