Задача проверки данных полей формы, заполняемой пользователем на веб-сайте, на минимальное–максимальное числовое значение при помощи 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);
Удачи!
Спасибо, попользуем! ;)
Ответить
02.01.2007