You are here

function _webform_report_test_filters in Webform Report 7

Same name and namespace in other branches
  1. 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;
}