View source
<?php
function contextual_range_filter_config_form() {
$range_fields = array(
'date_field_names' => array(),
'list_field_names' => array(),
'numeric_field_names' => array(),
'string_field_names' => array(),
);
foreach (views_get_all_views() as $view) {
foreach ($view->display as $display_id => $display) {
if ($view
->set_display($display_id)) {
$items = $view
->get_items('argument', $display_id);
foreach ($items as $item) {
$table_data = views_fetch_data($item['table']);
$field_data = $table_data[$item['field']];
if (isset($field_data['argument']['handler'])) {
$handler = $field_data['argument']['handler'];
$is_date_handler = @is_a($handler, 'views_handler_argument_date', TRUE);
$is_list_handler = @is_a($handler, 'views_handler_argument_field_list', TRUE) || @is_a($handler, 'views_handler_argument_field_list_string', TRUE);
$is_string_handler = @is_a($handler, 'views_handler_argument_string', TRUE);
$is_numeric_handler = @is_a($handler, 'views_handler_argument_numeric', TRUE) || @is_a($handler, 'views_handler_argument_comment_user_uid', TRUE);
if ($is_date_handler || $is_list_handler || $is_numeric_handler || $is_string_handler) {
$title = $field_data['title'];
$full_name = $item['table'] . ':' . $item['field'];
$view_name = empty($view->human_name) ? $view->name : $view->human_name;
if (views_view_is_disabled($view)) {
$view_name .= ' (' . t('disabled') . ')';
}
if ($is_date_handler) {
_contextual_range_filter_add_to_range_fields($range_fields['date_field_names'][$full_name], $title, $view_name);
}
elseif ($is_list_handler) {
_contextual_range_filter_add_to_range_fields($range_fields['list_field_names'][$full_name], $title, $view_name);
}
elseif ($is_numeric_handler) {
_contextual_range_filter_add_to_range_fields($range_fields['numeric_field_names'][$full_name], $title, $view_name);
}
elseif ($is_string_handler) {
_contextual_range_filter_add_to_range_fields($range_fields['string_field_names'][$full_name], $title, $view_name);
}
}
}
}
}
}
}
$form['field_names'] = array(
'#type' => 'fieldset',
'#title' => t('Select contextual filters to be converted to contextual range filters'),
);
$labels = array(
t('date'),
t('list'),
t('numeric'),
t('string'),
);
$label = reset($labels);
foreach ($range_fields as $type => $data) {
$options = array();
foreach ($data as $full_name => $view_names) {
$options[$full_name] = t('%field in view: @views', array(
'%field' => reset($view_names),
'@views' => implode(', ', array_slice($view_names, 1)),
));
$form['#view_names'][$full_name] = array_slice($view_names, 1);
}
$form['field_names']["contextual_range_filter_{$type}"] = array(
'#type' => 'checkboxes',
'#title' => t('Select which of the below contextual <em>@label</em> filters should be converted to <em>@label range</em> filters:', array(
'@label' => $label,
)),
'#default_value' => variable_get("contextual_range_filter_{$type}", array()),
'#options' => $options,
);
$label = next($labels);
}
$form['actions']['#type'] = 'actions';
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => t('Save contextual filter conversions'),
);
$form['#submit'][] = 'contextual_range_filter_config_form_submit';
$form['#theme'] = 'system_settings_form';
return $form;
}
function contextual_range_filter_config_form_submit($form, &$form_state) {
form_state_values_clean($form_state);
foreach ($form_state['values'] as $type => $filters) {
$filters = array_filter($form_state['values'][$type]);
$prev_filters = variable_get($type, array());
$added_filters = array_diff($filters, $prev_filters);
$removed_filters = array_diff($prev_filters, $filters);
$changed_filters = array_merge($added_filters, $removed_filters);
if (empty($changed_filters)) {
continue;
}
variable_set($type, $filters);
$changed_view_names = array();
foreach ($changed_filters as $filter_name) {
if (isset($form['#view_names'][$filter_name])) {
$changed_view_names = array_merge($changed_view_names, $form['#view_names'][$filter_name]);
}
}
foreach (views_get_all_views() as $view) {
$view_name = empty($view->human_name) ? $view->name : $view->human_name;
if (in_array($view_name, $changed_view_names)) {
drupal_set_message(t('Saving view %view_name.', array(
'%view_name' => $view_name,
)));
$view
->save();
}
}
}
drupal_set_message(t('The contextual range filters have been saved and their corresponding views updated where necessary.'));
}
function _contextual_range_filter_add_to_range_fields(&$range_field_view_names, $title, $view_name) {
if (!isset($range_field_view_names)) {
$range_field_view_names = array(
$title,
);
}
if (!in_array($view_name, $range_field_view_names)) {
$range_field_view_names[] = $view_name;
}
}