Elvi Digital

Проверка данных формы на минимальное–максимальное числовое значение при помощи 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);

Удачи!