message = $message; $this->exceptions = $exceptions; } } class CPHPFormValidator { public function GenerateResultObject($failed, $critical) { if($failed === true && $critical === true) { $object = new CPHPFormValidatorAbort(); } else { $object = new CPHPFormValidatorResult(); } $object->handler = $this->handler; return $object; } public function RequireKey($key, $critical = false) { return $this->ProcessSingleValidationResult($key, (!isset($this->handler->formdata[$key])), "required", "A value is required for this field.", $critical); } public function ValidateEmail($key, $critical = false) { return $this->ProcessValidation($key, function($key, $value){ return filter_var($value, FILTER_VALIDATE_EMAIL) !== false; }, "email", "The value is not a valid e-mail address.", $critical); } public function ProcessValidation($key, $validator, $error_type, $error_message, $critical) { if(is_array($this->handler->formdata[$key])) { foreach($this->handler->formdata[$key] as $i => $value) { $result = $validator($key, $this->handler->formdata[$key], $this->handler); $return_object = $this->ProcessArrayValueValidationResult($key, $i, $result, $error_type, $error_message, $critical); if($result !== true && $critical === true) { return $return_object; } } return $return_object; } else { $result = $validator($key, $this->handler->formdata[$key], $this->handler); return $this->ProcessSingleValidationResult($key, $result, $error_type, $error_message, $critical); } } public function ProcessSingleValidationResult($key, $result, $error_type, $error_message, $critical) { if($result === false) { $this->handler->StoreValidationException(array( "type" => "single", "key" => $key, "error_type" => $error_type, "error_msg" => $error_message )); $failed = true; } else { $failed = false; } return $this->GenerateResultObject($failed, $critical); } public function ProcessArrayValueValidationResult($key, $i, $result, $error_type, $error_message, $critical) { if($result === false) { $this->handler->StoreValidationException(array( "type" => "array_value", "key" => $key, "index" => $i, "error_type" => $error_type, "error_msg" => $error_message ), $this); $failed = true; } else { $failed = false; } return $this->GenerateResultObject($failed, $critical); } public function Done() { $this->handler->RaiseValidationExceptions(false); } public function Either() { $statements = } public function All() { } public function ValidateIf($condition, $validation) { } } class CPHPFormHandler extends CPHPFormValidator { public function __construct($formdata = null, $no_csrf = false) { if(is_null($formdata)) { $this->formdata = $_POST; } else { $this->formdata = $formdata; } $this->no_csrf = $no_csrf; $this->handler = $this; $this->validation_exceptions = array(); $this->exception_buffer = array(); $this->first_validation = true; } public function StoreValidationException($exception, $validator_object) { if($validator_object == $this) { if($this->first_validation === true) { $this->first_validation = false; $this->validation_exceptions[] = $exception; } else { $this->exception_buffer[] = $exception; } } else { $this->validation_exceptions[] = $exception; } } public function RaiseValidationExceptions($aborted) { if(count($this->validation_exceptions) > 0) { throw new FormValidationException("One or more validation errors occurred.", $this->validation_exceptions); } $this->validation_exceptions = array(); } public function GetGroupedValues($keys) { /* Returns an array of associative arrays. This is used for forms that have * multiple array inputs, and where each input has a corresponding element * for another input name. */ $sCounts = array(); foreach($keys as $key) { $sCounts[] = count($this->formdata[$key]); } $sTotalItems = max($sCounts); $sAllValues = array(); for($i = 0; $i < $sTotalItems; $i++) { $sValues = array(); foreach($keys as $key) { $sValues[$key] = $this->formdata[$key][$i]; } $sAllValues[] = $sValues; } return $sAllValues; } public function GetValues($key) { /* Returns an array with zero or more values for the given key. If the key * does not exist, an empty array is returned. */ if(!isset($_POST[$key])) { return array(); } elseif(is_array($_POST[$key])) { return $_POST[$key]; } else { return array($_POST[$key]); } } public function GetValue($key) { /* Returns a single value for the given key. If the key contains an array, it * will return the first element. If the key does not exist, it will return null. */ if(!isset($_POST[$key])) { return null; } elseif(is_array($_POST[$key])) { return $_POST[$key][0]; } else { return $_POST[$key]; } } } class CPHPFormValidatorResult extends CPHPFormValidator { } class CPHPFormValidatorAbort { public function Abort() { $this->handler->RaiseValidationExceptions(true); } public function __get($anything) { return $this->Abort; } }