function _webform_report_test_filters in Webform Report 7
Same name and namespace in other branches
- 6.2 webform_report.inc \_webform_report_test_filters()
test data against filters
Parameters
data: array of raw submission data
filters: list of filters to test against data
Return value
TRUE if filters passed, otherwise FALSE
1 call to _webform_report_test_filters()
- _webform_report_get_report_data in ./
webform_report.inc - Get webform report data
File
- ./
webform_report.inc, line 516 - This file contains common functions and functions required to ouput a report for the webform report module
Code
function _webform_report_test_filters($data, $filters, $columns) {
// filter result, return true if no filters
$ok = TRUE;
// if any filters
if (count($filters) > 0) {
// search flag
$hit = FALSE;
// loop through all filters
foreach ($filters as $index => $filter) {
// reset result for each filter
$ok = FALSE;
// check that cid is in data
if (array_key_exists($filter['cid'], $data)) {
// get raw data
$raw = $data[$filter['cid']];
// format value
foreach ($columns as $col) {
if ($col['cid'] == $filter['cid']) {
break;
}
}
$value = _webform_report_format_data($raw, $col);
// prepare filter values
$filter_data = strip_tags(strtolower(trim($value['data'])));
$filter_value = $filter['value'];
// Do token substitution - after checking whether the
// value might even contain a token
if (strpos($filter_value, '[') !== FALSE) {
// load submitter user and webform node if not done
if (!isset($submitter)) {
$submitter = user_load($data['uid']);
}
if (!isset($wfnode)) {
$wfnode = node_load($data['nid']);
}
// replace globals
$filter_value = token_replace($filter_value);
// replace submitter user values and webform node values
$filter_value = token_replace($filter_value, array(
'user' => $submitter,
'node' => $wfnode,
));
}
// normalize
$filter_value = strtolower(trim($filter_value));
// extract filter values for between
if ($filter['ftype'] == 13) {
$filter_value = explode('|', $filter_value);
// should be two values
if (count($filter_value) == 1) {
$filter_value[] = '';
}
}
// flag eq, ne, gt, lt, ge, le, between compares
$cmpflag = $filter['ftype'] == 5 || $filter['ftype'] == 6 || $filter['ftype'] == 9 || $filter['ftype'] == 10 || $filter['ftype'] == 11 || $filter['ftype'] == 12 || $filter['ftype'] == 13;
// see if special date and time processing is required
if ($filter['type'] == 'date' && $cmpflag) {
// user entered date
if ($filter['cid'] > 0) {
// dates are stored as yyyy-mm-dd
$filter_data = new DateTime($raw[0]);
}
else {
$filter_data = new DateTime();
$filter_data
->setTimeStamp($raw[0]);
}
}
if ($filter['type'] == 'time' && $cmpflag) {
// user entered time - stored as hh:mm:ss
if ($filter['cid'] > 0) {
$filter_data = new DateTime($raw[0]);
}
else {
$filter_data = new DateTime();
$filter_data
->setTimeStamp($raw[0]);
}
}
// convert filter value to timestamp if necessary
if (($filter['type'] == 'date' || $filter['type'] == 'time') && $cmpflag) {
if (is_array($filter_value)) {
$filter_value[0] = new DateTime($filter_value[0]);
$filter_value[1] = new DateTime($filter_value[1]);
}
else {
$filter_value = new DateTime($filter_value);
}
}
// extract filename for file types
if ($filter['type'] == 'file') {
$filter_data = '';
if (is_numeric($raw[0])) {
// must load the webform file component handler
module_load_include('inc', 'webform', 'components/file');
$file = webform_get_file($raw[0]);
if (!empty($file->fid)) {
$filter_data = webform_file_name($file->filename);
}
}
}
// convert to numeric if flagged and a non-string comparison
if ($col['num'] && $cmpflag) {
$filter_data = $filter_data + 0;
if ($filter['ftype'] == 13) {
$filter_value[0] = $filter_value[0] + 0;
$filter_value[1] = $filter_value[1] + 0;
}
else {
$filter_value = $filter_value + 0;
}
}
// apply filter
switch ($filter['ftype']) {
// search for x
case -1:
// convert submission date and time to strings
if ($filter['cid'] == -2 || $filter['cid'] == -3) {
$filter_data = new DateTime();
$filter_data
->setTimeStamp($raw[0]);
$filter_value = new DateTime($filter_value);
if ($filter_data && $filter_value) {
if ($filter['cid'] == -2) {
$filter_data = $filter_data
->setTime(0, 0, 0);
$filter_value = $filter_value
->setTime(0, 0, 0);
if ($filter_data == $filter_value) {
$hit = TRUE;
$ok = TRUE;
}
}
if ($filter['cid'] == -3) {
$dh = (int) $filter_data
->format('G');
$vh = (int) $filter_value
->format('G');
$dm = (int) $filter_data
->format('i');
$vm = (int) $filter_value
->format('i');
if ($dh == $vh && $dm == $vm) {
$hit = TRUE;
$ok = TRUE;
}
}
}
}
else {
if ($filter_data != '' && strpos($filter_data, $filter_value) !== FALSE) {
$hit = TRUE;
$ok = TRUE;
}
}
break;
// none
case 0:
$ok = TRUE;
// Begins with x.
case 1:
if (substr($filter_data, 0, drupal_strlen($filter_value)) == $filter_value) {
$ok = TRUE;
}
break;
// Does not begin with x.
case 2:
if (substr($filter_data, 0, drupal_strlen($filter_value)) != $filter_value) {
$ok = TRUE;
}
break;
// Contains x.
case 3:
if (!$filter_value || strpos($filter_data, $filter_value) !== FALSE) {
$ok = TRUE;
}
break;
// Does not contain x.
case 4:
if (!$filter_value || strpos($filter_data, $filter_value) === FALSE) {
$ok = TRUE;
}
break;
// Equals x.
case 5:
if ($filter_data == $filter_value) {
$ok = TRUE;
}
break;
// Does not equal x.
case 6:
if ($filter_data != $filter_value) {
$ok = TRUE;
}
break;
// is empty
case 7:
if (drupal_strlen($filter_data) == 0) {
$ok = TRUE;
}
break;
// is not empty
case 8:
if (drupal_strlen($filter_data) != 0) {
$ok = TRUE;
}
break;
// greater than
case 9:
if ($filter_data > $filter_value) {
$ok = TRUE;
}
break;
// less than
case 10:
if ($filter_data < $filter_value) {
$ok = TRUE;
}
break;
// greater than or equal
case 11:
if ($filter_data >= $filter_value) {
$ok = TRUE;
}
break;
// less than or equal
case 12:
if ($filter_data <= $filter_value) {
$ok = TRUE;
}
break;
// between
case 13:
// negate filter if both values are empty
if (!$filter_value[0] && !$filter_value[1] || $filter_data >= $filter_value[0] && $filter_data <= $filter_value[1]) {
$ok = TRUE;
}
break;
}
// end - switch($filter['type'])...
}
else {
if ($filter['ftype'] == 0) {
// pass it
$ok = TRUE;
}
}
// if hit on search, quit - search filters are last,
// so any report filters have already been applied
if ($hit) {
break;
}
// if last filter was search, keep going
if ($filter['ftype'] == -1) {
continue;
}
// if filter did not pass, don't check any further
if (!$ok) {
break;
}
}
// end - foreach($filters as $index => $filter)...
}
// end - if (count($filters) > 0)...
// return filter result
return $ok;
}