$info) { $query_types = array_flip($info['query types']); // The check on "field type" is specific to Search Api. $field_type = empty($info['field type']) ? '' : $info['field type']; // @todo check if there is a beter way to do this. if (isset($query_types['date']) || 'list' == $field_type) { // Add the date_range to the query types $facet_info[$name]['query types'][] = 'date_range'; // This widget needs a different way to set labels // so we add our own callback. $facet_info[$name]['map options']['value callback'] = '_date_facets_api_facet_create_label'; $facet_info[$name]['query types'][] = 'date_range'; } } } /** * Value callback for labels with the date range type. * * Just added a basic functionality. * Might need to be expanded for more functionality. * * @param array $values * @param array $options * @return array */ function _date_facets_api_facet_create_label(array $values, array $options) { $map = array(); // Loop through all the values to create a map. // It does nothing yet but more functionality might be added. foreach ($values as $key => $value) { $map[$key] = $value; } return $map; } /** * Returns render arrays for all date ranges. * * @return array * An associative array of date ranges. */ function date_facets_get_ranges($ranges) { $build = array(); uasort($ranges, 'drupal_sort_weight'); foreach ($ranges as $range_data) { $build[$range_data['machine_name']] = array( '#count' => NULL, '#markup' => check_plain($range_data['label']), '#weight' => $range_data['weight'], ); } return $build; } /** * Implements hook_theme(). */ function date_facets_theme() { return array( 'date_facets_tabledrag_form' => array( 'render element' => 'form', ), ); } /** * Add a tabledrag table for date ranges on the given date facet. */ function theme_date_facets_tabledrag_form($variables) { $form = $variables['form']; if (is_array($form['widget']['widget_settings']['ranges'])) { $header = array( array('data' => t('Name !required', array('!required' => '*'))), array('data' => t('Date Range !required', array('!required' => '*')), 'colspan' => 2), array('data' => t('Weight')), array('data' => t('Delete')) ); drupal_add_tabledrag('facetapi-date-range-query-date-ranges', 'order', 'self', 'date-range-weight'); $rows = array(); foreach (element_children($form['widget']['widget_settings']['ranges']) as $range_key) { $row = array(); // We remove the #titles from each of the fields because the titles are // already in the table's header row. unset($form['widget']['widget_settings']['ranges'][$range_key]['label']['#title']); // We want the label and machine name fields in the same cell. $row[] = drupal_render($form['widget']['widget_settings']['ranges'][$range_key]['label']) . drupal_render($form['widget']['widget_settings']['ranges'][$range_key]['machine_name']); foreach (array('date_range_start', 'date_range_end') as $element) { $temp_row = ''; // We want the op, amount, and unit fields in the same cell for both // start and end date ranges. foreach (array('op', 'amount', 'unit') as $item) { unset($form['widget']['widget_settings']['ranges'][$range_key][$element . '_' . $item]['#title']); $temp_row .= drupal_render($form['widget']['widget_settings']['ranges'][$range_key][$element . '_' . $item]); } $row[] = $temp_row; } // Add the weight and delete checkbox fields. foreach (array('weight', 'delete') as $element) { unset($form['widget']['widget_settings']['ranges'][$range_key][$element]['#title']); $row[] = drupal_render($form['widget']['widget_settings']['ranges'][$range_key][$element]); } $rows[] = array( 'data' => $row, 'class' => array('draggable'), ); } $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'facetapi-date-range-query-date-ranges'))); $form['widget']['widget_settings']['date_ranges']['ranges'] = array( '#type' => 'markup', '#markup' => $output, '#weight' => 0, ); } return drupal_render_children($form); } /** * Custom date range form validation. */ function date_facets_tabledrag_form_validate($form, &$form_state) { $error = FALSE; $temp_error = FALSE; foreach ($form_state['values']['ranges'] as $range_key => $range_data) { if ($range_data['delete']) { unset($form_state['values']['ranges'][$range_key]); continue; } foreach (array('date_range_start', 'date_range_end') as $item) { // If the op is NOW, we don't need to validate an amount. if ($range_data[$item . '_op'] != 'NOW') { if (empty($range_data[$item . '_amount'])) { $key = $item . '_amount'; form_set_error("ranges][$range_key][$key", t('You must enter an amount.')); $error = TRUE; } } } foreach (array('label', 'machine_name') as $element) { if (empty($range_data[$element])) { form_set_error("ranges][$range_key][$element", t('%item is required.', array('%item' => $element))); $error = TRUE; } } if (!$error) { // If there were no validation errors, we move the date range to be keyed // by it's machine name. unset($form_state['values']['ranges'][$range_key]); $form_state['values']['ranges'][$range_data['machine_name']] = $range_data; } } return !$error; } /** * Date range machine name existence check. * @TODO: Make this actually work. */ function date_facets_date_range_exists($label) { return FALSE; } /** * Custom date range AJAX handler. Rebuild the entire form for now, unfortunately. */ function date_facets_tabledrag_form_new_range($form, &$form_state) { $form_state['add_new_range'] = TRUE; return drupal_rebuild_form($form['#form_id'], $form_state, $form); } /** * Provides the default date ranges. */ function date_facets_default_ranges() { return array( 'past_hour' => array( 'machine_name' => 'past_hour', 'label' => t('Past hour'), 'date_range_start_op' => '-', 'date_range_start_amount' => '1', 'date_range_start_unit' => 'HOUR', 'date_range_end_op' => 'NOW', 'date_range_end_amount' => '', 'date_range_end_unit' => '', 'weight' => 0, ), 'past_24_hours' => array( 'machine_name' => 'past_24_hours', 'label' => t('Past 24 hours'), 'date_range_start_op' => '-', 'date_range_start_amount' => '24', 'date_range_start_unit' => 'HOUR', 'date_range_end_op' => 'NOW', 'date_range_end_amount' => '', 'date_range_end_unit' => '', 'weight' => 1, ), 'past_week' => array( 'machine_name' => 'past_week', 'label' => t('Past week'), 'date_range_start_op' => '-', 'date_range_start_amount' => '7', 'date_range_start_unit' => 'DAY', 'date_range_end_op' => 'NOW', 'date_range_end_amount' => '', 'date_range_end_unit' => '', 'weight' => 2, ), 'past_month' => array( 'machine_name' => 'past_month', 'label' => t('Past month'), 'date_range_start_op' => '-', 'date_range_start_amount' => '1', 'date_range_start_unit' => 'MONTH', 'date_range_end_op' => 'NOW', 'date_range_end_amount' => '', 'date_range_end_unit' => '', 'weight' => 3, ), 'past_year' => array( 'machine_name' => 'past_year', 'label' => t('Past year'), 'date_range_start_op' => '-', 'date_range_start_amount' => '1', 'date_range_start_unit' => 'YEAR', 'date_range_end_op' => 'NOW', 'date_range_end_amount' => '', 'date_range_end_unit' => '', 'weight' => 4, ), ); }