00001 <?PHP
00002
00003 #
00004 # FILE: FormTool.php
00005 #
00006 # Part of the Collection Workflow Integration System (CWIS)
00007 # Copyright 2006-2011 Edward Almasy and Internet Scout
00008 # http://scout.wisc.edu
00009 #
00010
00011 class FormTool {
00012
00013 # ---- PUBLIC INTERFACE --------------------------------------------------
00014
00015 # object constructor
00016 function FormTool($FormFields, $AdditionalErrorMessages = NULL)
00017 {
00018 # save field info with field name as index
00019 foreach ($FormFields as $Field)
00020 {
00021 $this->Fields[$Field->Name()] = $Field;
00022 }
00023
00024 # save additional error messages (if any)
00025 $this->AdditionalErrorMessages = $AdditionalErrorMessages;
00026
00027 # set default error color
00028 $this->ErrorColor = "red";
00029
00030 # save any additional fields indicated to be marked for error
00031 if (isset($_GET["FTAddErrFields"]) && count($_GET["FTAddErrFields"]))
00032 {
00033 $this->AdditionalErrorFields = explode("!", $_GET["FTAddErrFields"]);
00034 }
00035 else
00036 {
00037 $this->AdditionalErrorFields = array();
00038 }
00039 }
00040
00041 # get/set field values
00042 function ValueForField($FieldName, $NewValue = NULL)
00043 {
00044 return $this->Fields[$FieldName]->Value($NewValue);
00045 }
00046
00047 # checks whether all required form variables are set in $_POST
00048 function AllRequiredVarsAreSet()
00049 {
00050 # assume that all required variables will be found
00051 $AllFound = TRUE;
00052
00053 # for each required form variable
00054 foreach ($this->Fields as $FieldName => $Field)
00055 {
00056 # if variable is not set in $_POST
00057 if (!isset($_POST[$FieldName]) || !strlen($_POST[$FieldName]))
00058 {
00059 # set flag indicating we found a missing var and exit loop
00060 $AllFound = FALSE;
00061 break;
00062 }
00063 }
00064
00065 # report back to caller whether we found on required vars
00066 return $AllFound;
00067 }
00068
00069 # return URL parameter string with form values that are set (from $_POST)
00070 # (returns empty string if none of the form values are set)
00071 # (URL parameter string does not include leading separator (? or &))
00072 function GetValsAsUrlParams($IncludePasswords = FALSE)
00073 {
00074 # assume no values will be found
00075 $UrlParams = "";
00076
00077 # for each form field
00078 foreach ($this->Fields as $FieldName => $Field)
00079 {
00080 # if form value is set and contains something and is not excluded
00081 if (isset($_POST[$FieldName])
00082 && strlen(trim($_POST[$FieldName]))
00083 && (!$Field->IsPassword() || $IncludePasswords))
00084 {
00085 # add value to URL param string
00086 $UrlParams = strlen($UrlParams)
00087 ? $UrlParams."&".$FieldName."=".urlencode($_POST[$FieldName])
00088 : $FieldName."=".urlencode($_POST[$FieldName]);
00089 }
00090 }
00091
00092 # return parameter string to caller
00093 return $UrlParams;
00094 }
00095
00096 # set field values from URL parameters where available
00097 function SetFieldValuesFromUrlParams()
00098 {
00099 # for each field
00100 foreach ($this->Fields as $FieldName => $Field)
00101 {
00102 # if value is available for field in incoming GET parameters
00103 if (isset($_GET[$FieldName]))
00104 {
00105 # set field value
00106 $Field->Value($_GET[$FieldName]);
00107 }
00108 }
00109 }
00110
00111 # check form values for each field and report whether errors found
00112 function IncomingFieldValuesHaveErrors()
00113 {
00114 return (count($_GET) || count($_POST)) ?
00115 (strlen($this->GetErrorCodesAsUrlParams()) ? TRUE : FALSE) : FALSE;
00116 }
00117
00118 # return URL parameter string with codes for any form value errors
00119 # (returns empty string if no errors found)
00120 # (URL parameter string does not include leading separator (? or &))
00121 function GetErrorCodesAsUrlParams()
00122 {
00123 # start with empty error code string
00124 $ErrorCodeString = "";
00125
00126 # for each field value
00127 foreach ($this->Fields as $FieldName => $Field)
00128 {
00129 # if validation function says that value is invalid
00130 $ErrorCode = $this->CheckFieldValue($FieldName);
00131 if ($ErrorCode)
00132 {
00133 # add error code for value to error code string
00134 $ErrorCodeString .= (strlen($ErrorCodeString) ? "!" : "")
00135 .$FieldName."-".$ErrorCode;
00136 }
00137 }
00138
00139 # if values were added to error code string
00140 if (strlen($ErrorCodeString))
00141 {
00142 # prepend name of GET variable to contain error codes
00143 $ErrorCodeString = "FTFieldErrs=".$ErrorCodeString;
00144 }
00145
00146 # if additional error codes were supplied
00147 if (isset($this->AdditionalErrorCodes) && count($this->AdditionalErrorCodes))
00148 {
00149 # for each additional error code
00150 foreach ($this->AdditionalErrorCodes as $Code)
00151 {
00152 # append code to string
00153 $AddCodeString = isset($AddCodeString) ? $AddCodeString."!".$Code
00154 : $Code;
00155 }
00156
00157 # append additional error code string to error code string
00158 $ErrorCodeString .= (strlen($ErrorCodeString) ? "&" : "")
00159 ."FTAddErrCodes=".$AddCodeString;
00160 }
00161
00162 # if additional fields were supplied to be marked as erroneous
00163 if (count($this->AdditionalErrorFields))
00164 {
00165 # for each additional error code
00166 foreach ($this->AdditionalErrorFields as $FieldName)
00167 {
00168 # append code to string
00169 $AddFieldString = isset($AddFieldString) ? $AddFieldString."!".$FieldName
00170 : $FieldName;
00171 }
00172
00173 # append additional error code string to error code string
00174 $ErrorCodeString .= (strlen($ErrorCodeString) ? "&" : "")
00175 ."FTAddErrFields=".$AddFieldString;
00176 }
00177
00178 # return error code string to caller
00179 return $ErrorCodeString;
00180 }
00181
00182 # save additional fields to be marked as having errors
00183 function SetAdditionalErrorFields($FieldNames)
00184 {
00185 # convert to array if needed
00186 if (!is_array($FieldNames))
00187 {
00188 $FieldNames = array($FieldNames);
00189 }
00190
00191 # save fields (if not already present)
00192 foreach ($FieldNames as $FieldName)
00193 {
00194 if (!in_array($FieldName, $this->AdditionalErrorFields))
00195 {
00196 $this->AdditionalErrorFields[] = $FieldName;
00197 }
00198 }
00199 }
00200
00201 # save additional error codes
00202 function SetAdditionalErrorCodes($Codes)
00203 {
00204 # convert to array if needed
00205 if (!is_array($Codes))
00206 {
00207 $Codes = array($Codes);
00208 }
00209
00210 # save codes (if not already present)
00211 foreach ($Codes as $Code)
00212 {
00213 if (!isset($this->AdditionalErrorCodes)
00214 || !in_array($Code, $this->AdditionalErrorCodes))
00215 {
00216 $this->AdditionalErrorCodes[] = $Code;
00217 }
00218 }
00219 }
00220
00221 # convenience function that adds value and err codes to URL
00222 function GetUrlWithValuesAndErrorCodes($BaseUrl, $IncludePasswords = FALSE)
00223 {
00224 $ValParams = $this->GetValsAsUrlParams($IncludePasswords);
00225 $ErrParams = $this->GetErrorCodesAsUrlParams();
00226 $ParamStart = strpos($BaseUrl, "?") ? "&" : "?";
00227 return $BaseUrl
00228 .(strlen($ValParams) ? $ParamStart.$ValParams : "")
00229 .(strlen($ErrParams) ?
00230 (strlen($ValParams) ? "&" : $ParamStart).$ErrParams : "");
00231 }
00232
00233 # get list of error messages based on codes from URL ($_GET)
00234 function GetErrorMessages($EliminateDuplicateMessages = TRUE)
00235 {
00236 # start with empty list
00237 $ErrorList = array();
00238
00239 # if it looks like there are field-specific error messages to be had
00240 if (isset($_GET["FTFieldErrs"]))
00241 {
00242 # split error data into list of fields
00243 $FieldList = explode("!", $_GET["FTFieldErrs"]);
00244
00245 # for each field found
00246 foreach ($FieldList as $FieldListEntry)
00247 {
00248 # split field entry into name and code
00249 list($FieldName, $ErrorCode) = explode("-", $FieldListEntry);
00250
00251 # if we know about this field
00252 if (isset($this->Fields[$FieldName]))
00253 {
00254 # translate error code into message and add to list
00255 $Field = $this->Fields[$FieldName];
00256 $Replacements = array(
00257 "%N" => "<i>".$Field->Name()."</i>",
00258 "%V" => "<i>".$Field->Value()."</i>",
00259 "%L" => "<i>".preg_replace("/:$/", "", $Field->Label())."</i>",
00260 "%C" => "<i>".$ErrorCode."</i>",
00261 );
00262 $Message = $Field->GetInvalidValueMessage($ErrorCode);
00263 $ErrorList[$FieldName] = str_replace(
00264 array_keys($Replacements), $Replacements, $Message);
00265 }
00266 }
00267 }
00268
00269 # if it looks like there are additional general error messages to be had
00270 if (isset($_GET["FTAddErrCodes"]) && count($this->AdditionalErrorMessages))
00271 {
00272 # split error data into list of codes
00273 $CodeList = explode("!", $_GET["FTAddErrCodes"]);
00274
00275 # for each code found
00276 foreach ($CodeList as $Code)
00277 {
00278 # if there is a message corresponding to this code
00279 if (isset($this->AdditionalErrorMessages[$Code]))
00280 {
00281 # add message to list
00282 $ErrorList[$Code] = $this->AdditionalErrorMessages[$Code];
00283 }
00284 }
00285 }
00286
00287 # remove duplicate messages (if requested by caller)
00288 if ($EliminateDuplicateMessages)
00289 {
00290 $NewErrorList = array();
00291 foreach ($ErrorList as $Code => $Message)
00292 {
00293 if (!in_array($Message, $NewErrorList))
00294 {
00295 $NewErrorList[$Code] = $Message;
00296 }
00297 }
00298 $ErrorList = $NewErrorList;
00299 }
00300
00301 # return list of error messages to caller
00302 return $ErrorList;
00303 }
00304
00305 # print tags for specified field
00306 function PrintField($FieldName)
00307 {
00308 $this->Fields[$FieldName]->PrintField(
00309 ($this->ErrorCodesAvailable() && $this->CheckFieldValue($FieldName))
00310 || in_array($FieldName, $this->AdditionalErrorFields));
00311 }
00312 function PrintLabelForField($FieldName)
00313 {
00314 $this->Fields[$FieldName]->PrintLabel(
00315 ($this->ErrorCodesAvailable() && $this->CheckFieldValue($FieldName))
00316 || in_array($FieldName, $this->AdditionalErrorFields));
00317 }
00318 function PrintInputForField($FieldName)
00319 {
00320 $this->Fields[$FieldName]->PrintInput(
00321 ($this->ErrorCodesAvailable() && $this->CheckFieldValue($FieldName))
00322 || in_array($FieldName, $this->AdditionalErrorFields));
00323 }
00324
00325 # report whether error codes are available
00326 function ErrorCodesAvailable()
00327 {
00328 return isset($_GET["FTFieldErrs"]) || isset($_GET["FTAddErrCodes"]);
00329 }
00330
00331 # return array of US state names with two-letter abbreviations as index
00332 static function GetArrayOfUsStates()
00333 {
00334 return array(
00335 "" => "--",
00336 "AL" => "Alabama",
00337 "AK" => "Alaska",
00338 "AZ" => "Arizona",
00339 "AR" => "Arkansas",
00340 "CA" => "California",
00341 "CO" => "Colorado",
00342 "CT" => "Connecticut",
00343 "DE" => "Delaware",
00344 "DC" => "District of Columbia",
00345 "FL" => "Florida",
00346 "GA" => "Georgia",
00347 "HI" => "Hawaii",
00348 "ID" => "Idaho",
00349 "IL" => "Illinois",
00350 "IN" => "Indiana",
00351 "IA" => "Iowa",
00352 "KS" => "Kansas",
00353 "KY" => "Kentucky",
00354 "LA" => "Louisiana",
00355 "ME" => "Maine",
00356 "MD" => "Maryland",
00357 "MA" => "Massachusetts",
00358 "MI" => "Michigan",
00359 "MN" => "Minnesota",
00360 "MS" => "Mississippi",
00361 "MO" => "Missouri",
00362 "MT" => "Montana",
00363 "NE" => "Nebraska",
00364 "NV" => "Nevada",
00365 "NH" => "New Hampshire",
00366 "NJ" => "New Jersey",
00367 "NM" => "New Mexico",
00368 "NY" => "New York",
00369 "NC" => "North Carolina",
00370 "ND" => "North Dakota",
00371 "OH" => "Ohio",
00372 "OK" => "Oklahoma",
00373 "OR" => "Oregon",
00374 "PA" => "Pennsylvania",
00375 "RI" => "Rhode Island",
00376 "SC" => "South Carolina",
00377 "SD" => "South Dakota",
00378 "TN" => "Tennessee",
00379 "TX" => "Texas",
00380 "UT" => "Utah",
00381 "VT" => "Vermont",
00382 "VA" => "Virginia",
00383 "WA" => "Washington",
00384 "WV" => "West Virginia",
00385 "WI" => "Wisconsin",
00386 "WY" => "Wyoming",
00387 );
00388 }
00389
00390
00391 # ---- PRIVATE INTERFACE -------------------------------------------------
00392
00393 var $Fields;
00394 var $ErrorColor;
00395 var $AdditionalErrorCodes;
00396 var $AdditionalErrorFields;
00397 var $AdditionalErrorMessages;
00398
00399 # check form (POST) value for specified field and return error code
00400 function CheckFieldValue($FieldName)
00401 {
00402 $Value = isset($_POST[$FieldName]) ? $_POST[$FieldName]
00403 : (isset($_GET[$FieldName]) ? $_GET[$FieldName] : NULL);
00404 $ErrorCode = $this->Fields[$FieldName]->IsInvalidValue($Value);
00405 return $ErrorCode;
00406 }
00407 }
00408
00409 ?>