Skip to content

Instantly share code, notes, and snippets.

@gormus
Created March 23, 2018 06:51
Show Gist options
  • Save gormus/83246e8cd892d70c6e2e3a2f900e3af2 to your computer and use it in GitHub Desktop.
Save gormus/83246e8cd892d70c6e2e3a2f900e3af2 to your computer and use it in GitHub Desktop.
Transform select-type exposed filters into jump menus.
<?php
// Rename this file to `CUSTOMMODULE.module`
/**
* Implements hook_form_FORM_ID_alter().
*/
function CUSTOMMODULE_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
// Replace `Size` filter.
CUSTOMMODULE_jumpmenu($form, 'field_size_tid');
// Replace `Color` filter.
CUSTOMMODULE_jumpmenu($form, 'field_color_tid');
// Non-existing filter.
CUSTOMMODULE_jumpmenu($form, 'field_doesnt_exist');
}
/**
* Transform select filters into a simple jump menu.
*
* @param $form
* Nested array of form elements that comprise the form.
* @param $field_name
* String representing the name of the field to be replaced.
*/
function CUSTOMMODULE_jumpmenu(&$form, $field_name) {
if (
isset($form[$field_name])
&& ($form[$field_name]['#type'] === 'select')
&& !empty($form[$field_name]['#options'])
) {
$options = &$form[$field_name]['#options'];
foreach ($options as $tid => $value) {
if (is_int($tid)) {
$path = drupal_get_path_alias('taxonomy/term/' . $tid);
$options[url($path)] = $value;
unset($options[$tid]);
}
}
$form[$field_name]['#attributes']['onChange'] = 'javascript:if (this.value !== "All") { location.href = this.value; return false; }';
return $form;
}
return [];
}
<?php
// Rename this file to `CUSTOMMODULE.views_default.inc`
/**
* Implements hook_views_default_views().
*/
function CUSTOMMODULE_views_default_views() {
$views = array();
$view = new view();
$view->name = 'example_view';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'Example view';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'Example view';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['pager']['options']['items_per_page'] = '50';
$handler->display->display_options['style_plugin'] = 'table';
$handler->display->display_options['style_options']['columns'] = array(
'title' => 'title',
'field_color' => 'field_color',
'field_size' => 'field_size',
);
$handler->display->display_options['style_options']['default'] = '-1';
$handler->display->display_options['style_options']['info'] = array(
'title' => array(
'sortable' => 0,
'default_sort_order' => 'asc',
'align' => '',
'separator' => '',
'empty_column' => 0,
),
'field_color' => array(
'sortable' => 0,
'default_sort_order' => 'asc',
'align' => '',
'separator' => '',
'empty_column' => 0,
),
'field_size' => array(
'sortable' => 0,
'default_sort_order' => 'asc',
'align' => '',
'separator' => '',
'empty_column' => 0,
),
);
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Field: Content: Color */
$handler->display->display_options['fields']['field_color']['id'] = 'field_color';
$handler->display->display_options['fields']['field_color']['table'] = 'field_data_field_color';
$handler->display->display_options['fields']['field_color']['field'] = 'field_color';
/* Field: Content: Size */
$handler->display->display_options['fields']['field_size']['id'] = 'field_size';
$handler->display->display_options['fields']['field_size']['table'] = 'field_data_field_size';
$handler->display->display_options['fields']['field_size']['field'] = 'field_size';
/* Sort criterion: Content: Title */
$handler->display->display_options['sorts']['title']['id'] = 'title';
$handler->display->display_options['sorts']['title']['table'] = 'node';
$handler->display->display_options['sorts']['title']['field'] = 'title';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Content: Type */
$handler->display->display_options['filters']['type']['id'] = 'type';
$handler->display->display_options['filters']['type']['table'] = 'node';
$handler->display->display_options['filters']['type']['field'] = 'type';
$handler->display->display_options['filters']['type']['value'] = array(
'tshirt' => 'tshirt',
);
/* Filter criterion: Content: Size (field_size) */
$handler->display->display_options['filters']['field_size_tid']['id'] = 'field_size_tid';
$handler->display->display_options['filters']['field_size_tid']['table'] = 'field_data_field_size';
$handler->display->display_options['filters']['field_size_tid']['field'] = 'field_size_tid';
$handler->display->display_options['filters']['field_size_tid']['exposed'] = TRUE;
$handler->display->display_options['filters']['field_size_tid']['expose']['operator_id'] = 'field_size_tid_op';
$handler->display->display_options['filters']['field_size_tid']['expose']['label'] = 'Size';
$handler->display->display_options['filters']['field_size_tid']['expose']['operator'] = 'field_size_tid_op';
$handler->display->display_options['filters']['field_size_tid']['expose']['identifier'] = 'field_size_tid';
$handler->display->display_options['filters']['field_size_tid']['expose']['remember_roles'] = array(
2 => '2',
1 => 0,
3 => 0,
);
$handler->display->display_options['filters']['field_size_tid']['type'] = 'select';
$handler->display->display_options['filters']['field_size_tid']['vocabulary'] = 'size';
/* Filter criterion: Content: Color (field_color) */
$handler->display->display_options['filters']['field_color_tid']['id'] = 'field_color_tid';
$handler->display->display_options['filters']['field_color_tid']['table'] = 'field_data_field_color';
$handler->display->display_options['filters']['field_color_tid']['field'] = 'field_color_tid';
$handler->display->display_options['filters']['field_color_tid']['exposed'] = TRUE;
$handler->display->display_options['filters']['field_color_tid']['expose']['operator_id'] = 'field_color_tid_op';
$handler->display->display_options['filters']['field_color_tid']['expose']['label'] = 'Color';
$handler->display->display_options['filters']['field_color_tid']['expose']['operator'] = 'field_color_tid_op';
$handler->display->display_options['filters']['field_color_tid']['expose']['identifier'] = 'field_color_tid';
$handler->display->display_options['filters']['field_color_tid']['expose']['remember_roles'] = array(
2 => '2',
1 => 0,
3 => 0,
);
$handler->display->display_options['filters']['field_color_tid']['type'] = 'select';
$handler->display->display_options['filters']['field_color_tid']['vocabulary'] = 'color';
/* Display: Page */
$handler = $view->new_display('page', 'Page', 'page');
$handler->display->display_options['path'] = 'example-view';
$handler->display->display_options['menu']['type'] = 'normal';
$handler->display->display_options['menu']['title'] = 'Example view';
$handler->display->display_options['menu']['name'] = 'main-menu';
$views['example_view'] = $view;
return $views;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment