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 found failure, validate ok
                $_sess[$_key]['valid'] = 1;
                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
                            foreach ($formvars[$_field] as $_fv_key => $_fv_value) {
                                if(($_new_val = SmartyValidate::_execute_transform($_trans_name, $formvars[$_field][$_fv_key], $_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
                        foreach ($formvars[$_field] as $_fv_key => $_fv_value) {
                            if(! $_sess[$_key]['valid'] = SmartyValidate::_is_valid_criteria($_val['criteria'], $formvars[$_field][$_fv_key], $_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;
    }
예제 #2
0
 /**
  * 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 = 'default')
 {
     $_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;
     }
     // keep track of failed fields for current pass
     static $_failed_fields = array();
     $_ret = true;
     $_sess =& $_SESSION['SmartyValidate'][$form]['validators'];
     $_smarty_assign_fields = array();
     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;
         }
         $_field = $_sess[$_key]['field'];
         $_field_key = null;
         $_empty = isset($_sess[$_key]['empty']) ? $_sess[$_key]['empty'] : false;
         $_assign = isset($_sess[$_key]['assign']) ? $_sess[$_key]['assign'] : null;
         $_append = isset($_sess[$_key]['append']) ? $_sess[$_key]['append'] : null;
         $_message = isset($_sess[$_key]['message']) ? $_sess[$_key]['message'] : null;
         // 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 (in_array($_field, $_failed_fields)) {
             // already failed, skip this test
             continue;
         }
         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 (is_array($formvars[$_field]) && !$_trans_on_array) {
                     if ($_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;
             $_ret = !$_ret ? false : $_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 ($_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']) {
             $_failed_fields[] = $_field;
             if (isset($_append)) {
                 $_smarty_assign_fields[$_append][$_field] = $_message;
             }
             if (isset($_assign)) {
                 $_smarty_assign_fields[$_assign] = $_message;
             }
             $_ret = false;
             if (isset($_sess[$_key]['halt']) && $_sess[$_key]['halt']) {
                 break;
             }
         }
     }
     // set validation state of form
     $_SESSION['SmartyValidate'][$form]['is_error'] = !$_ret;
     SmartyValidate::_smarty_assign($_smarty_assign_fields);
     return $_ret;
 }