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; }
/** * 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; }