/trunk/flatpress/fp-includes/smarty/SmartyValidate.class.php
PHP | 662 lines | 387 code | 75 blank | 200 comment | 108 complexity | 14ad319caa2ea6a79aa8127cbfc48552 MD5 | raw file
Possible License(s): AGPL-1.0, GPL-2.0, MIT
- <?php
- /**
- * Project: SmartyValidate: Form Validator for the Smarty Template Engine
- * File: SmartyValidate.class.php
- * Author: Monte Ohrt <monte at newdigitalgroup dot com>
- * Website: http://www.phpinsider.com/php/code/SmartyValidate/
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- *
- * @link http://www.phpinsider.com/php/code/SmartyValidate/
- * @copyright 2001-2005 New Digital Group, Inc.
- * @author Monte Ohrt <monte at newdigitalgroup dot com>
- * @package SmartyValidate
- * @version 2.8
- */
- if(!defined('SMARTY_VALIDATE_DEFAULT_FORM'))
- define('SMARTY_VALIDATE_DEFAULT_FORM', 'default');
- class SmartyValidate {
- /**
- * Class Constructor
- */
- function SmartyValidate() { }
-
- /**
- * initialize the validator
- *
- * @param obj $smarty the smarty object
- * @param string $reset reset the default form?
- */
- function connect(&$smarty, $reset = false) {
- if(SmartyValidate::is_valid_smarty_object($smarty)) {
- SmartyValidate::_object_instance('Smarty', $smarty);
- SmartyValidate::register_form(SMARTY_VALIDATE_DEFAULT_FORM, $reset);
- } else {
- trigger_error("SmartyValidate: [connect] I need a valid Smarty object.");
- return false;
- }
- }
- /**
- * test if object is a valid smarty object
- *
- * @param obj $smarty_obj the smarty object
- */
- function is_valid_smarty_object(&$smarty_obj) {
- return (is_object($smarty_obj) && (strtolower(get_class($smarty_obj)) == 'smarty' || is_subclass_of($smarty_obj, 'smarty')));
-
- }
-
- /**
- * clear the entire SmartyValidate session
- *
- */
- function disconnect() {
- unset($_SESSION['SmartyValidate']);
- SmartyValidate::_object_instance('-', $_dummy);
- }
-
- /**
- * initialize the session data
- *
- * @param string $form the name of the form being validated
- * @param string $reset reset an already registered form?
- */
- function register_form($form, $reset = false) {
- if(SmartyValidate::is_registered_form($form) && !$reset) {
- return false;
- } else {
- $_SESSION['SmartyValidate'][$form] = array();
- $_SESSION['SmartyValidate'][$form]['registered_funcs']['criteria'] = array();
- $_SESSION['SmartyValidate'][$form]['registered_funcs']['transform'] = array();
- $_SESSION['SmartyValidate'][$form]['validators'] = array();
- $_SESSION['SmartyValidate'][$form]['is_error'] = false;
- $_SESSION['SmartyValidate'][$form]['is_init'] = true;
- SmartyValidate::_smarty_assign();
- return true;
- }
- }
-
- /**
- * unregister a form from the session
- *
- * @param string $form the name of the form being validated
- */
- function unregister_form($form) {
- unset($_SESSION['SmartyValidate'][$form]);
- }
-
- /**
- * test if the session data is initialized
- *
- * @param string $form the name of the form being validated
- */
- function is_registered_form($form = SMARTY_VALIDATE_DEFAULT_FORM) {
- return isset($_SESSION['SmartyValidate'][$form]);
- }
-
- function _failed_fields(&$formvars, $form = SMARTY_VALIDATE_DEFAULT_FORM, $revalidate = false)
- {
- // keep track of failed fields
- static $_failed_fields = array();
-
- if(isset($_failed_fields[$form]) && !$revalidate) {
- // already validated the form
- return $_failed_fields[$form];
- }
-
- // failed fields for current pass
- $_ret = array();
-
- $_sess =& $_SESSION['SmartyValidate'][$form]['validators'];
-
- foreach($_sess as $_key => $_val) {
-
- if(isset($_SESSION['SmartyValidate'][$form]['page'])
- && $_sess[$_key]['page'] != $_SESSION['SmartyValidate'][$form]['page']) {
- // not on page, do not validate
- continue;
- }
- $_full_field = $_field = $_sess[$_key]['field'];
- $_field_key = null;
- $_empty = isset($_sess[$_key]['empty']) ? $_sess[$_key]['empty'] : false;
- $_message = isset($_sess[$_key]['message']) ? $_sess[$_key]['message'] : null;
- if(is_array($_ret) && in_array($_full_field, $_ret)) {
- // already failed, skip this test
- continue;
- }
-
- // field is name-keyed array, pull it apart
- if(($_lpos = strpos($_field, '[')) !== false && ($_rpos = strpos($_field, ']')) !== false) {
- if (($_keylen = ($_rpos - $_lpos - 1)) > 0) {
- $_field_key = substr($_field, $_lpos+1, $_keylen);
- }
- $_field = substr($_field, 0, $_lpos);
- }
-
- if(isset($_sess[$_key]['transform'])) {
- $_trans_names = preg_split('![\s,]+!', $_sess[$_key]['transform'], -1, PREG_SPLIT_NO_EMPTY);
- if($_sess[$_key]['trim']) {
- // put trim on front of transform array
- array_unshift($_trans_names, 'trim');
- }
- foreach($_trans_names as $_trans_name) {
- if(substr($_trans_name,0,1) == '@') {
- // transformation will apply to entire array
- $_trans_on_array = true;
- $_trans_name = substr($_trans_name,1);
- } else {
- // transformation will apply to each array element
- $_trans_on_array = false;
- }
-
- if(strpos($_trans_name,':') !== false) {
- // transform has parameters, put them in $formvars
- $_trans_parts = explode(':', $_trans_name);
- $_trans_name = array_shift($_trans_parts);
- $_trans_index = 2;
- foreach($_trans_parts as $_trans_param) {
- $_trans_field = $_trans_name . $_trans_index;
- $_sess[$_key][$_trans_field] = $_trans_param;
- $_trans_index++;
- }
- }
-
- if(is_array($formvars[$_field]) && !$_trans_on_array) {
- if(isset($_field_key)) {
- // only apply to given key
- if(($_new_val = SmartyValidate::_execute_transform($_trans_name, $formvars[$_field][$_field_key], $_sess[$_key], $formvars, $form)) !== false)
- $formvars[$_field][$_field_key] = $_new_val;
-
- } else {
- // apply to all keys
- for($_x = 0, $_y = count($formvars[$_field]); $_x < $_y; $_x++) {
- if(($_new_val = SmartyValidate::_execute_transform($_trans_name, $formvars[$_field][$_x], $_sess[$_key], $formvars, $form)) !== false)
- $formvars[$_field][$_x] = $_new_val;
- }
- }
- } else {
- if(($_new_val = SmartyValidate::_execute_transform($_trans_name, $formvars[$_field], $_sess[$_key], $formvars, $form)) !== false)
- $formvars[$_field] = $_new_val;
- }
- }
- }
- if((!isset($formvars[$_field]) && (!isset($_FILES[$_field])))
- || (
- ((is_array($formvars[$_field]) && count($_field) == 0) || (is_string($formvars[$_field]) && strlen($formvars[$_field]) == 0)) && $_empty
- )
- ) {
- // field must exist, or else fails automatically
- $_sess[$_key]['valid'] = $_empty;
- } else {
- if(substr($_val['criteria'],0,1) == '@') {
- // criteria will apply to entire array or given key
- $_criteria_on_array = true;
- $_val['criteria'] = substr($_val['criteria'],1);
- } else {
- // criteria will apply to each array element
- $_criteria_on_array = false;
- }
-
- if(is_array($formvars[$_field]) && !$_criteria_on_array) {
- if(isset($_field_key)) {
- // only apply to given key
- $_sess[$_key]['valid'] = SmartyValidate::_is_valid_criteria($_val['criteria'], $formvars[$_field][$_field_key], $_empty, $_sess[$_key], $formvars, $form);
- } else {
- // apply to all keys
- for($_x = 0, $_y = count($formvars[$_field]); $_x < $_y; $_x++) {
- if(! $_sess[$_key]['valid'] = SmartyValidate::_is_valid_criteria($_val['criteria'], $formvars[$_field][$_x], $_empty, $_sess[$_key], $formvars, $form)) {
- // found invalid array element, exit for loop
- break;
- }
- }
- }
- } else {
- $_sess[$_key]['valid'] = SmartyValidate::_is_valid_criteria($_val['criteria'], $formvars[$_field], $_empty, $_sess[$_key], $formvars, $form);
- }
- }
-
- if(!$_sess[$_key]['valid']) {
- $_ret[] = $_full_field;
- if(isset($_sess[$_key]['halt']) && $_sess[$_key]['halt'])
- break;
- }
- }
-
- $_failed_fields[$form] = $_ret;
-
- return $_ret;
- }
-
- /**
- * validate the form
- *
- * @param string $formvars the array of submitted for variables
- * @param string $form the name of the form being validated
- */
- function is_valid(&$formvars, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
-
- static $_is_valid = array();
-
- if(isset($_is_valid[$form])) {
- // already validated the form
- return $_is_valid[$form];
- }
-
- $_smarty_obj =& SmartyValidate::_object_instance('Smarty', $_dummy);
- if(!SmartyValidate::is_valid_smarty_object($_smarty_obj)) {
- trigger_error("SmartyValidate: [is_valid] No valid smarty object, call connect() first.");
- return false;
- }
- if(!SmartyValidate::is_registered_form($form)) {
- trigger_error("SmartyValidate: [is_valid] form '$form' is not registered.");
- return false;
- } elseif ($_SESSION['SmartyValidate'][$form]['is_init']) {
- // first run, skip validation
- return false;
- } elseif (count($_SESSION['SmartyValidate'][$form]['validators']) == 0) {
- // nothing to validate
- return true;
- }
-
- // check for failed fields
- $_failed_fields = SmartyValidate::_failed_fields($formvars, $form);
- $_ret = is_array($_failed_fields) && count($_failed_fields) == 0;
-
- // set validation state of form
- $_SESSION['SmartyValidate'][$form]['is_error'] = !$_ret;
-
- $_is_valid[$form] = $_ret;
-
- return $_ret;
- }
-
- /**
- * register a callable function for form verification
- *
- * @param string $func_name the function being registered
- */
- function register_object($object_name, &$object) {
- if(!is_object($object)) {
- trigger_error("SmartyValidate: [register_object] not a valid object.");
- return false;
- }
- SmartyValidate::_object_instance($object_name, $object);
- }
-
- /**
- * register a callable function for form verification
- *
- * @param string $func_name the function being registered
- */
- function is_registered_object($object_name) {
- $_object =& SmartyValidate::_object_instance($object_name, $_dummy);
- return is_object($_object);
- }
- /**
- * register a callable function for form verification
- *
- * @param string $func_name the function being registered
- */
- function register_criteria($name, $func_name, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- return SmartyValidate::_register_function('criteria', $name, $func_name, $form);
- }
-
- /**
- * register a callable function for form verification
- *
- * @param string $func_name the function being registered
- */
- function register_transform($name, $func_name, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- return SmartyValidate::_register_function('transform', $name, $func_name, $form);
- }
-
- /**
- * test if a criteria function is registered
- *
- * @param string $var the value being booleanized
- */
- function is_registered_criteria($name, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- if(!SmartyValidate::is_registered_form($form)) {
- trigger_error("SmartyValidate: [is_registered_criteria] form '$form' is not registered.");
- return false;
- }
- return isset($_SESSION['SmartyValidate'][$form]['registered_funcs']['criteria'][$name]);
- }
-
- /**
- * test if a tranform function is registered
- *
- * @param string $var the value being booleanized
- */
- function is_registered_transform($name, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- if(!SmartyValidate::is_registered_form($form)) {
- trigger_error("SmartyValidate: [is_registered_transform] form '$form' is not registered.");
- return false;
- }
- return isset($_SESSION['SmartyValidate'][$form]['registered_funcs']['transform'][$name]);
- }
- /**
- * register a validator
- *
- * @param string $id the id of the validator
- * @param string $field the field to be validated
- * @param string $criteria the name of the criteria function
- * @param string $empty allow field to be empty (optional)
- * @param string $halt stop validation if this one fails (optional)
- * @param string $transform transform function(s) to apply (optional)
- * @param string $form name of the form (optional)
- */
- function register_validator($id, $field, $criteria, $empty = false, $halt = false, $transform = null, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- if(!SmartyValidate::is_registered_form($form)) {
- trigger_error("SmartyValidate: [register_validator] form '$form' is not registered.");
- return false;
- }
- SmartyValidate::unregister_validator($id,$form);
-
- $_field = explode(':', $field);
- $_validator = array();
-
- foreach($_field as $_key => $_val) {
- if($_key == 0)
- $_validator['field'] = $_val;
- else {
- $_field_name = 'field';
- $_field_name .= $_key + 1;
- $_validator[$_field_name] = $_val;
- }
- }
-
- $_validator['id'] = $id;
- $_validator['criteria'] = $criteria;
- $_validator['message'] = '';
- $_validator['trim'] = false;
- $_validator['empty'] = $empty;
- $_validator['halt'] = $halt;
- $_validator['transform'] = $transform;
-
- $_SESSION['SmartyValidate'][$form]['validators'][] = $_validator;
- }
- /**
- * register a validator
- *
- * @param string $id the id of the validator
- * @param string $transform the name of the transform function(s)
- * @param string $form name of the form (optional)
- */
- function set_transform($id, $transform, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
-
- if(($_validator_key = SmartyValidate::is_registered_validator($id,$form)) === false) {
- trigger_error("SmartyValidate: [set_transform] validator '$id' is not registered.");
- return false;
- }
-
- $_SESSION['SmartyValidate'][$form]['validators'][$_validator_key]['transform'] = $transform;
- }
-
-
- /**
- * test if a validator is registered
- *
- * @param string $id the validator to test
- */
- function is_registered_validator($id, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- if(!SmartyValidate::is_registered_form($form)) {
- trigger_error("SmartyValidate: [is_registered_validator] form '$form' is not registered.");
- return false;
- }
-
- foreach($_SESSION['SmartyValidate'][$form]['validators'] as $_key => $_val) {
- if($_SESSION['SmartyValidate'][$form]['validators'][$_key]['id'] == $id) {
- // return array index of validator
- return $_key;
- }
- }
- return false;
- }
- /**
- * unregister a validator
- *
- * @param string $id the validator to unregister
- */
- function unregister_validator($id, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- if(!SmartyValidate::is_registered_form($form)) {
- return false;
- }
-
- foreach($_SESSION['SmartyValidate'][$form]['validators'] as $_key => $_val) {
- if(isset($_SESSION['SmartyValidate'][$form]['validators'][$_key]['id'])
- && $_SESSION['SmartyValidate'][$form]['validators'][$_key]['id'] == $id) {
- unset($_SESSION['SmartyValidate'][$form]['validators'][$_key]);
- break;
- }
- }
- }
- /**
- * set the current page of the form
- *
- * @param string $page the name of the page being validated
- * @param string $form the name of the form being validated
- */
- function set_page($page, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- $_SESSION['SmartyValidate'][$form]['page'] = $page;
- $_SESSION['SmartyValidate'][$form]['is_error'] = false;
- $_SESSION['SmartyValidate'][$form]['is_init'] = true;
- }
-
- /**
- * return actual function name of registered func
- *
- * @param string $type the type of func
- * @param string $name the registered name
- * @param string $form the form name
- */
- function _execute_transform($name, $value, $params, &$formvars, $form) {
-
- if(SmartyValidate::is_registered_transform($name, $form)) {
- $_func_name = SmartyValidate::_get_registered_func_name('transform', $name, $form);
- } else {
- $_func_name = 'smarty_validate_transform_' . $name;
- if(!function_exists($_func_name)) {
- $_smarty_obj =& SmartyValidate::_object_instance('Smarty', $_dummy);
- if($_plugin_file = $_smarty_obj->_get_plugin_filepath('validate_transform', $name)) {
- include_once($_plugin_file);
- } else {
- trigger_error("SmartyValidate: [is_valid] transform function '$name' was not found.");
- return false;
- }
- }
- }
- if(strpos($_func_name,'->') !== false) {
- // object method
- preg_match('!(\w+)->(\w+)!', $_func_name, $_match);
- $_object_name = $_match[1];
- $_method_name = $_match[2];
- $_object =& SmartyValidate::_object_instance($_object_name, $_dummy);
- if(!method_exists($_object, $_method_name)) {
- trigger_error("SmartyValidate: [is_valid] method '$_method_name' is not valid for object '$_object_name'.");
- return false;
- }
- return $_object->$_method_name($value, $params, $formvars);
- } else {
- return $_func_name($value, $params, $formvars);
- }
- }
-
- /**
- * register a callable function for form verification
- *
- * @param string $func_name the function being registered
- */
- function _register_function($type, $name, $func_name, $form = SMARTY_VALIDATE_DEFAULT_FORM) {
- if(!SmartyValidate::is_registered_form($form)) {
- trigger_error("SmartyValidate: [register_$type] form '$form' is not registered.");
- return false;
- }
- if(strpos($func_name,'->') !== false) {
- // object method
- preg_match('!(\w+)->(\w+)!', $func_name, $_match);
- $_object_name = $_match[1];
- $_method_name = $_match[2];
- $_object =& SmartyValidate::_object_instance($_object_name, $_dummy);
- if(!method_exists($_object, $_method_name)) {
- trigger_error("SmartyValidate: [register_$type] method '$_method_name' is not valid for object '$_object_name'.");
- return false;
- }
- } elseif (strpos($func_name,'::') !== false) {
- // static method
- preg_match('!(\w+)::(\w+)!', $func_name, $_match);
- if(!is_callable(array($_match[1], $_match[2]))) {
- trigger_error("SmartyValidate: [register_$type] static method '$func_name' does not exist.");
- return false;
- }
- } elseif(!function_exists($func_name)) {
- trigger_error("SmartyValidate: [register_$type] function '$func_name' does not exist.");
- return false;
- }
- $_SESSION['SmartyValidate'][$form]['registered_funcs'][$type][$name] = $func_name;
- return true;
- }
- /**
- * return actual function name of registered func
- *
- * @param string $type the type of func
- * @param string $name the registered name
- * @param string $form the form name
- */
- function _get_registered_func_name($type,$name,$form) {
- return isset($_SESSION['SmartyValidate'][$form]['registered_funcs'][$type][$name])
- ? $_SESSION['SmartyValidate'][$form]['registered_funcs'][$type][$name]
- : false;
- }
-
-
- /**
- * booleanize a value
- *
- * @param string $var the value being booleanized
- */
- function _booleanize($var) {
- if(in_array(strtolower($var), array(true, 1, 'true','on','yes','y'),true)) {
- return true;
- }
- return false;
- }
-
- /**
- * validate criteria for given value
- *
- * @param string $criteria the criteria to test against
- * @param string $value the value being tested
- * @param string $empty skip empty values or not
- */
- function _is_valid_criteria($criteria, $value, $empty, &$params, &$formvars, $form) {
- if(SmartyValidate::is_registered_criteria($criteria,$form)) {
- $_func_name = SmartyValidate::_get_registered_func_name('criteria',$criteria, $form);
- } else {
- $_func_name = 'smarty_validate_criteria_' . $criteria;
- if(!function_exists($_func_name)) {
- $_smarty_obj =& SmartyValidate::_object_instance('Smarty', $_dummy);
- if($_plugin_file = $_smarty_obj->_get_plugin_filepath('validate_criteria', $criteria)) {
- include_once($_plugin_file);
- } else {
- trigger_error("SmartyValidate: [is_valid] criteria function '$criteria' was not found.");
- return false;
- }
- }
- }
- if(strpos($_func_name,'->') !== false) {
- // object method
- preg_match('!(\w+)->(\w+)!', $_func_name, $_match);
- $_object_name = $_match[1];
- $_method_name = $_match[2];
- $_object =& SmartyValidate::_object_instance($_object_name, $_dummy);
- if(!method_exists($_object, $_method_name)) {
- trigger_error("SmartyValidate: [is_valid] method '$_method_name' is not valid for object '$_object_name'.");
- return false;
- }
- return $_object->$_method_name($value, $empty, $params, $formvars);
- } else {
- return $_func_name($value, $empty, $params, $formvars);
- }
- }
-
- /**
- * get or set an object instance
- *
- * @param string $name the object name
- * @param object $object the object being set
- */
- function &_object_instance($name, &$object) {
- $return = false;
- static $_objects = array();
- if ($name=='-') {
- unset ($_objects);
- static $_objects = array();
- }
- if(!is_object($object)) {
- if (isset($_objects[$name]))
- return $_objects[$name];
- else
- return $return;
- } else {
- $_objects[$name] =& $object;
- return $object;
- }
- }
-
- /**
- * get or set the smarty object instance
- *
- * @param string $value the value being tested
- */
- function _smarty_assign($vars = array()) {
-
- $_smarty_obj =& SmartyValidate::_object_instance('Smarty', $_dummy);
-
- if(!is_object($_smarty_obj)) {
- trigger_error("SmartyValidate: [assign] no valid smarty object found, call connect() first.");
- return false;
- }
-
- if(!empty($vars)) {
- $_smarty_obj->assign($vars);
- }
- foreach($_SESSION['SmartyValidate'] as $_key => $_val) {
- $_info[$_key]['is_error'] = isset($_SESSION['SmartyValidate'][$_key]['is_error']) ? $_SESSION['SmartyValidate'][$_key]['is_error'] : null;
- }
- $_smarty_obj->assign('validate', $_info);
-
- }
-
- }
- ?>