function _date_views_filter_handler in Date 5.2
Same name and namespace in other branches
- 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);
}
}