From f445d1cd5c576ea79b35fb926a76bb8a748751f6 Mon Sep 17 00:00:00 2001 From: Marco Villegas Date: Fri, 5 Aug 2011 01:47:30 -0500 Subject: [PATCH] Issue #1240238 by marvil07: Let use toggle links on the exposed form sorts. Show only one of the sorts(per sort_by type) when using links as select replacement. This also adds an option at the exposed_form views plugin. --- better_exposed_filters.module | 14 +++++++ better_exposed_filters.theme | 3 ++ better_exposed_filters_exposed_form_plugin.inc | 46 +++++++++++++++++++----- 3 files changed, 54 insertions(+), 9 deletions(-) diff --git a/better_exposed_filters.module b/better_exposed_filters.module index 5ec0d90..201dcc3 100644 --- a/better_exposed_filters.module +++ b/better_exposed_filters.module @@ -55,3 +55,17 @@ function bef_sort_combine_submit($form, &$form_state) { // And pass this along to Views views_exposed_form_submit($form, $form_state); } + +function bef_get_current_sort_value_by_sort_by_key($key, $form_state) { + if (!isset($form_state['input']['sort_bef_combine'])) { + return FALSE; + } + $sort_bef_combine = explode(' ', $form_state['input']['sort_bef_combine'], 2); + if (!is_array($sort_bef_combine) || count($sort_bef_combine) != 2) { + return FALSE; + } + if ($sort_bef_combine[0] != $key) { + return FALSE; + } + return $sort_bef_combine[1]; +} diff --git a/better_exposed_filters.theme b/better_exposed_filters.theme index 871d541..de01c7e 100644 --- a/better_exposed_filters.theme +++ b/better_exposed_filters.theme @@ -340,6 +340,9 @@ function theme_select_as_links($element) { } else { // Selected value is output without a link // TODO: Does that look funny in the display? Should add a "current" class to this elem? + if (isset($element['#settings']['toggle_links']) && $element['#settings']['toggle_links'] == '1' && array_search($key, $selected_options) !== FALSE) { + continue; + } $output .= theme('form_element', array('#id' => $id), $value); } } diff --git a/better_exposed_filters_exposed_form_plugin.inc b/better_exposed_filters_exposed_form_plugin.inc index 5fbbd3f..8bf6080 100644 --- a/better_exposed_filters_exposed_form_plugin.inc +++ b/better_exposed_filters_exposed_form_plugin.inc @@ -46,6 +46,18 @@ class better_exposed_filters_exposed_form_plugin extends views_plugin_exposed_fo ), '#description' => t('Select a format for the exposed sort options.'), ); + + $bef_options['sort']['toggle_links'] = array( + '#type' => 'checkbox', + '#title' => t('Toggle links per filter'), + '#default_value' => $this->options['bef']['sort']['toggle_links'], + '#description' => t('Use toogle links. Only applies when exposed sort options is set as Links.'), + '#dependency' => array( + 'edit-exposed-form-options-bef-sort-bef-format' => array('bef_links'), + ), + '#process' => array('views_process_dependency'), + ); + $bef_options['sort']['combine'] = array( '#type' => 'checkbox', '#title' => t('Combine sort order with sort by'), @@ -213,16 +225,8 @@ class better_exposed_filters_exposed_form_plugin extends views_plugin_exposed_fo } $selected = ''; - foreach ($form['sort_by']['#options'] as $by_key => $by_val) { - foreach ($form['sort_order']['#options'] as $order_key => $order_val) { - // Use a space to separate the two keys, we'll unpack them in our submit handler - $options["$by_key $order_key"] = "$by_val $order_val"; - } - } - $form['sort_bef_combine'] = array( '#type' => 'radios', - '#options' => $options, '#title' => $form['sort_by']['#title'], ); @@ -235,6 +239,7 @@ class better_exposed_filters_exposed_form_plugin extends views_plugin_exposed_fo case 'bef_links': $form['sort_bef_combine']['#theme'] = 'select_as_links'; + $form['sort_bef_combine']['#settings']['toggle_links'] = $this->options['bef']['sort']['toggle_links']; unset($form['sort_bef_combine']['#title']); break; @@ -243,6 +248,28 @@ class better_exposed_filters_exposed_form_plugin extends views_plugin_exposed_fo break; } + static $orders_already_set; + if (!isset($orders_already_set)) { + $orders_already_set = array(); + } + foreach ($form['sort_by']['#options'] as $by_key => $by_val) { + $current_order_key = bef_get_current_sort_value_by_sort_by_key($by_key, $form_state); + foreach ($form['sort_order']['#options'] as $order_key => $order_val) { + if ($this->options['bef']['sort']['bef_format'] == 'bef_links' && $form['sort_bef_combine']['#settings']['toggle_links'] == 1) { + if (isset($orders_already_set[$by_key])) { + continue; + } + if ($current_order_key == FALSE) { + $orders_already_set[$by_key] = TRUE; + } + } + + // Use a space to separate the two keys, we'll unpack them in our submit handler + $options["$by_key $order_key"] = "$by_val $order_val"; + } + } + + $form['sort_bef_combine']['#options'] = $options; // Add our submit routine to process $form['#submit'][] = 'bef_sort_combine_submit'; @@ -265,6 +292,7 @@ class better_exposed_filters_exposed_form_plugin extends views_plugin_exposed_fo } else if ('bef_links' == $this->options['bef']['sort']['bef_format']) { $form['sort_by']['#theme'] = 'select_as_links'; + $form['sort_by']['#settings']['toggle_links'] = $this->options['bef']['sort']['toggle_links']; $form['sort_order']['#theme'] = 'select_as_links'; } @@ -443,4 +471,4 @@ class better_exposed_filters_exposed_form_plugin extends views_plugin_exposed_fo $form['submit']['#access'] = $show_apply; } // function exposed_form_alter(...) -} \ No newline at end of file +} -- 1.7.5.4