You are here

function _date_views_filter_handler in Date 5.2

Same name and namespace in other branches
  1. 5 date_views.inc \_date_views_filter_handler()
2 calls to _date_views_filter_handler()
date_views_filter_handler in date/date.module
_date_views_timestamp_filter_handler in date/date_views.inc
Handler for date filter.

File

date/date_views.inc, line 227

Code

function _date_views_filter_handler($op, $filter, $filterinfo, &$query, $field_type = DATE_ISO) {
  require_once './' . drupal_get_path('module', 'date_api') . '/date_api_sql.inc';
  require_once './' . drupal_get_path('module', 'date_api') . '/date_api_elements.inc';

  // There's no simple way to do this, figure out if this filter has an
  // exposed value, and if so, ignore options like 'now'. Need to do
  // this so we don't adjust to 'now' when the date is deliberately
  // set to be empty in an exposed filter, while still using 'now'
  // as the default value when nothing has been submitted in the exposed
  // filter.
  $view = $GLOBALS['current_view'];
  foreach ((array) $view->exposed_filter as $delta => $exposed_filter) {
    $exposed_delta = trim(str_replace('filter', '', $name));
    $exposed_field = $view->exposed_filter[$exposed_delta]['field'];
    if ($filter['field'] == $exposed_field && $delta == $exposed_delta) {

      // This is an exposed filter that has been submitted.
      if (isset($_GET['filter' . $exposed_delta])) {
        $filter['options'] = '';
      }
    }
  }

  // $filter['value'] could either be an array of 'date' and 'time',
  // or an array of date parts, or a single value, depending on which
  // widget was used. Normalize the values before analyzing them.
  $field = $filterinfo['extra']['field'];
  $types = content_types($field['type_name']);
  $field = $types['fields'][$field['field_name']];
  $column = $filterinfo['extra']['column'];
  $db_info = $filterinfo['content_db_info'];

  // A submitted date_select will be an array of date parts.
  if (is_array($filter['value']) && array_key_exists('year', $filter['value'])) {
    $value = date_convert($filter['value'], DATE_ARRAY, DATE_DATETIME);
  }
  elseif (is_array($filter['value']) && array_key_exists('date', $filter['value'])) {
    $format = !empty($field['widget']['input_format_custom']) ? $field['widget']['input_format_custom'] : $field['widget']['input_format'];
    $format = date_limit_format($format, date_granularity($field));

    // If time is empty, make sure the custom format isn't expecting it.
    if (empty($filter['value']['time'])) {
      $format = date_limit_format($format, array(
        'year',
        'month',
        'day',
      ));
    }
    $value = trim($filter['value']['date'] . ' ' . $filter['value']['time']);
    $value = date_convert_from_custom($value, $format);
  }
  else {
    $value = $filter['value'];
  }

  // Filter out 5.1 version values that won't work in 5.2.
  if ($filterinfo['type'] == 'DATE' && !preg_match(DATE_REGEX_LOOSE, $value)) {
    $value = '';
  }
  if (empty($value) && empty($filter['options'])) {
    return;
  }
  $table = 'node_data_' . $field['field_name'];
  $sql_field = "{$table}." . $db_info['columns'][$column]['column'];
  $table = 'node_data_' . $field['field_name'];
  $date_handler = new date_sql_handler();
  $date_handler
    ->construct($field['type']);
  $timezone = date_default_timezone_name();
  date_views_set_timezone($date_handler, $field);
  $sql = '';
  $adjustment = trim(str_replace('now', '', $filter['options']));

  // Comparing to NOW.
  if (empty($value) && !empty($filter['options'])) {
    $date = date_now();
    if (!empty($adjustment)) {
      date_modify($date, $adjustment);
    }
    switch ($filterinfo['type']) {
      case 'YEAR':
      case 'MONTH':
      case 'DAY':
        $formats = array(
          'YEAR' => 'Y',
          'MONTH' => 'n',
          'DAY' => 'j',
        );
        $value = date_format($date, $formats[$filterinfo['type']]);
        $sql = $date_handler
          ->sql_where_extract($filterinfo['type'], $sql_field, $filter['operator'], $value, FALSE);
        break;
      default:
        $granularity = $field['granularity'];
        $granularity = array_pop(array_filter($granularity));
        $format = $date_handler
          ->views_formats($granularity, 'sql');
        $sql = $date_handler
          ->sql_where_format($format, $sql_field, $filter['operator'], date_format($date, $format));
        break;
    }
  }
  elseif ($filterinfo['type'] == 'DATE') {
    if (!empty($value)) {
      if (date_is_valid($value, DATE_DATETIME, $field['granularity'])) {
        $date = date_make_date($value, date_default_timezone_name(), DATE_DATETIME, $field['granularity']);
        if (!empty($adjustment)) {
          date_modify($date, $adjustment);
        }
        $formats = array(
          'YEAR' => 'Y',
          'MONTH' => 'n',
          'DAY' => 'j',
          'DATE' => DATE_FORMAT_DATETIME,
        );
        $value = date_format_date($date, 'custom', $formats[$filterinfo['type']]);
        $sql = $date_handler
          ->sql_where_date('DATE', $sql_field, $filter['operator'], $value);
      }
      else {
        drupal_set_message(t('That is not a valid date.'));
      }
    }
  }
  else {
    $sql = $date_handler
      ->sql_where_extract($filterinfo['type'], $sql_field, $filter['operator'], $value);
  }
  if (!empty($sql)) {
    $query
      ->ensure_table($table);
    $query
      ->add_where($sql);
  }
}