. */ class CFDBFunctionEvaluator { /** * @var CFDBValueConverter callback that can be used to pre-process values in the filter string * passed into parse($filterString). * For example, a function might take the value '$user_email' and replace it with an actual email address * just prior to checking it against input data in call evaluate($data) */ var $compValuePreprocessor; /** * @param $compValuePreprocessor CFDBValueConverter */ public function setCompValuePreprocessor($compValuePreprocessor) { $this->compValuePreprocessor = $compValuePreprocessor; } /** * @param $functionArray array ['function name', 'param1', 'param2', ...] * @param $data array [name => value] * @return mixed */ public function evaluateFunction($functionArray, &$data) { $functionName = array_shift($functionArray); for ($i = 0; $i < count($functionArray); $i++) { $functionArray[$i] = $this->preprocessValues($functionArray[$i]); // See if the parameter is a field name that can be dereferenced. $functionArray[$i] = isset($data[$functionArray[$i]]) ? $data[$functionArray[$i]] : $functionArray[$i]; // Dereference PHP Constants if (defined($functionArray[$i])) { $functionArray[$i] = constant($functionArray[$i]); } } if (empty($functionArray)) { // If function has no parameters, pass in the whole form entry associative array $functionArray[] = &$data; } return call_user_func_array($functionName, $functionArray); } /** * @param $text string * @return mixed */ public function preprocessValues($text) { if ($this->compValuePreprocessor) { try { $text = $this->compValuePreprocessor->convert($text); } catch (Exception $ex) { trigger_error($ex, E_USER_NOTICE); } } return $text; } }