diff --git a/views_content/plugins/content_types/views_panes.inc b/views_content/plugins/content_types/views_panes.inc index 6d1371a..a5915a3 100644 --- a/views_content/plugins/content_types/views_panes.inc +++ b/views_content/plugins/content_types/views_panes.inc @@ -271,7 +271,29 @@ function views_content_views_panes_content_type_render($subtype, $conf, $panel_a } if ($allow['exposed_form'] && !empty($conf['exposed'])) { - $view->set_exposed_input($conf['exposed']); + $exposed_input = $conf['exposed']; + if ($exposed_form_overrides = $view->display_handler->get_option('exposed_form_overrides')) { + // Overrided configured with exposed. + $filters = $view->display_handler->get_option('filters'); + $current_exposed = $view->get_exposed_input(); + foreach ($filters as $id => $settings) { + // Override the configured with current if allowed. + if (!empty($exposed_form_overrides['filters'][$id])) { + if (!empty($current_exposed[$id])) { + $exposed_input[$id] = $current_exposed[$id]; + } + } + } + if (!empty($exposed_form_overrides['sorts']) && isset($current_exposed['sort_by'])) { + $exposed_input['sort_by'] = $current_exposed['sort_by']; + $exposed_input['sort_order'] = $current_exposed['sort_order']; + } + } + // Preserve op so reset works. + if (isset($current_exposed['op'])) { + $exposed_input['op'] = $current_exposed['op']; + } + $view->set_exposed_input($exposed_input); } $stored_feeds = drupal_add_feed(); @@ -485,6 +507,7 @@ function views_content_views_panes_content_type_edit_form($form, &$form_state) { } if ($allow['exposed_form']) { + $exposed_form_overrides = $view->display_handler->get_option('exposed_form_overrides'); // If the exposed form is part of pane configuration, get the exposed // form re-tool it for our use. $exposed_form_state = array( @@ -506,11 +529,23 @@ function views_content_views_panes_content_type_edit_form($form, &$form_state) { ); foreach ($exposed_form['#info'] as $id => $info) { + list($type, $key) = explode('-', $id); + $type = $type . 's'; + // Don't set this if this is set to exposed. + if (!empty($exposed_form_overrides[$type][$key]) && $exposed_form_overrides[$type][$key] == 'exposed') { + continue; + } $form['exposed'][$id] = array( '#type' => 'item', '#id' => 'views-exposed-pane', ); - + if($exposed_form_overrides[$type][$key] == 'configureable') { + $form['exposed'][$id]['expose_to_visitor'] = array( + '#type' => 'checkbox', + '#title' => t('Expose to Visitor'), + '#default_value' => isset($conf['exposed'][$id]['expose_to_visitor']) ? $conf['exposed'][$id]['expose_to_visitor'] : 0, + ); + } if (!empty($info['label'])) { $form['exposed'][$id]['#title'] = $info['label']; } @@ -526,10 +561,45 @@ function views_content_views_panes_content_type_edit_form($form, &$form_state) { } } + // Allow individual panes to disable exposed form. + if (!empty($allow['exposed_form_configure'])) { + $has_exposed = FALSE; + foreach ($view->display_handler->get_option('filters') as $filter) { + if (!empty($filter['exposed'])) { + $has_exposed = TRUE; + break; + } + } + if ($has_exposed) { + $form['show_exposed_form'] = array( + '#type' => 'checkbox', + '#title' => t('Show Exposed Form'), + '#default_value' => isset($conf['show_exposed_form']) ? $conf['show_exposed_form'] : TRUE, + ); + } + } + // The exposed sort stuff doesn't fall into $exposed_form['#info'] so we // have to handle it separately. if (isset($exposed_form['sort_by'])) { + $exposed_form_overrides = $view->display_handler->get_option('exposed_form_overrides'); $form['exposed']['sort_by'] = $exposed_form['sort_by']; + if (!empty($exposed_form_overrides['sorts'])) { + foreach (array_filter($exposed_form_overrides['sorts']) as $id => $value) { + if ($value && $value == 'exposed') { + unset($form['exposed']['sort_by']['#options'][$id]); + } + } + $count = count($form['exposed']['sort_by']['#options']); + if ($count == 1) { + $form['exposed']['sort_by']['#access'] = FALSE; + $form['exposed']['sort_by']['#value'] = key($form['exposed']['sort_by']['#options']); + } + elseif (!$count) { + unset($exposed_form['sort_by']); + unset($exposed_form['sort_order']); + } + } } if (isset($exposed_form['sort_order'])) { @@ -548,7 +618,7 @@ function views_content_views_panes_content_type_edit_form($form, &$form_state) { function views_content_views_panes_content_type_edit_form_submit(&$form, &$form_state) { // Copy everything from our defaults. $keys = array('link_to_view', 'more_link', 'feed_icons', 'use_pager', - 'pager_id', 'items_per_page', 'offset', 'path_override', 'path', 'arguments', 'fields_override', 'exposed'); + 'pager_id', 'items_per_page', 'offset', 'path_override', 'path', 'arguments', 'fields_override', 'exposed', 'show_exposed_form'); foreach ($keys as $key) { if (isset($form_state['values'][$key])) { diff --git a/views_content/plugins/views/views_content_plugin_display_panel_pane.inc b/views_content/plugins/views/views_content_plugin_display_panel_pane.inc index e02f896..2381c46 100644 --- a/views_content/plugins/views/views_content_plugin_display_panel_pane.inc +++ b/views_content/plugins/views/views_content_plugin_display_panel_pane.inc @@ -33,10 +33,12 @@ class views_content_plugin_display_panel_pane extends views_plugin_display { 'path_override' => array('default' => FALSE), 'title_override' => array('default' => FALSE), 'exposed_form' => array('default' => FALSE), + 'exposed_form_configure' => array('default' => FALSE), 'fields_override' => array('default' => FALSE), ), ); + $options['exposed_form_overrides'] = array(); $options['argument_input'] = array('default' => array()); $options['link_to_view'] = array('default' => 0); $options['inherit_panels_path'] = array('default' => 0); @@ -167,6 +169,7 @@ class views_content_plugin_display_panel_pane extends views_plugin_display { 'path_override' => t('Path override'), 'title_override' => t('Title override'), 'exposed_form' => t('Use exposed widgets form as pane configuration'), + 'exposed_form_configure' => t('Exposed Form'), 'fields_override' => t('Fields override'), ); @@ -176,6 +179,39 @@ class views_content_plugin_display_panel_pane extends views_plugin_display { '#default_value' => $allow, '#options' => $options, ); + $form['exposed_form_overrides'] = array( + '#type' => 'fieldset', + '#title' => t('Exposed Form Filter Visibility'), + '#tree' => TRUE, + '#description' => t('Allows customizing which filters show up as pane configuration vs. exposed form.'), + '#states' => array( + 'visible' => array( + ':input[name="allow[exposed_form]"]' => array('checked' => TRUE), + ), + ), + ); + $exposed_form_overrides = $this->get_option('exposed_form_overrides'); + foreach (array('filters' => t('Filters'), 'sorts' => t('Sorts')) as $type => $label) { + foreach ($this->get_option($type) as $filter_id => $filter_info) { + if (!empty($filter_info['exposed'])) { + $form['exposed_form_overrides'][$type][$filter_id] = array( + '#type' => 'select', + '#title' => !empty($filter_info['expose']['label']) ? check_plain($filter_info['expose']['label']) : check_plain($filter_id), + '#options' => array( + '' => t('Pane configuration form only'), + 'pane_and_exposed' => t('Pane configuration form and exposed form'), + 'configureable' => t('Pane and option for exposed form'), + 'exposed' => t('Exposed form only') + ), + '#default_value' => !empty($exposed_form_overrides[$type][$filter_id]) ? $exposed_form_overrides[$type][$filter_id] : '', + ); + } + } + if (!empty($form['exposed_form_overrides'][$type])) { + $form['exposed_form_overrides'][$type]['#type'] = 'fieldset'; + $form['exposed_form_overrides'][$type]['#title'] = $label; + } + } break; case 'pane_title': $form['#title'] .= t('Administrative title'); @@ -323,6 +359,7 @@ class views_content_plugin_display_panel_pane extends views_plugin_display { parent::options_submit($form, $form_state); switch ($form_state['section']) { case 'allow': + $this->set_option('exposed_form_overrides', $form_state['values']['exposed_form_overrides']); case 'argument_input': case 'link_to_view': case 'inherit_panels_path': @@ -406,11 +443,30 @@ class views_content_plugin_display_panel_pane extends views_plugin_display { * displayed unless uses_exposed() returns TRUE. */ function displays_exposed() { + $pane_conf = $this->get_option('pane_conf'); + + // Allow indivudal panes to disable exposed form. + if (isset($pane_conf['show_exposed_form']) && empty($pane_conf['show_exposed_form'])) { + return FALSE; + } + $conf = $this->get_option('allow'); - // If this is set, the exposed form is part of pane configuration, not - // rendered normally. - return empty($conf['exposed_form']); - } + // If exposed_form is set, the exposed form is part of pane configuration, + // not rendered normally. + if (empty($conf['exposed_form'])) { + return TRUE; + } + // If any filter or field setting is not empty, the form is displayed. + $overrides = $this->get_option('exposed_form_overrides'); + if ($overrides) { + foreach (array_filter($overrides) as $override) { + if (array_filter($override)) { + return TRUE; + } + } + } + return FALSE; + } } diff --git a/views_content/views_content.module b/views_content/views_content.module index e5074f5..42bb42a 100644 --- a/views_content/views_content.module +++ b/views_content/views_content.module @@ -281,3 +281,55 @@ function _views_content_get_context_from_display($view, $id, $parent, $required 'view display id' => $id, ); } + +/** + * Implements hook_form_FORM_ID_alter(). + */ +function views_content_form_views_exposed_form_alter(&$form, $form_state) { + if ($overrides = $form_state['view']->display_handler->get_option('exposed_form_overrides')) { + $form['#after_build'][] = 'views_content_form_views_exposed_form_alter_remove_access'; + $form['#exposed_form_overrides'] = $overrides; + $form['#exposed_form_overrides_filters'] = $form_state['view']->display_handler->get_option('filters'); + } +} + +/** + * Removes any fields that are pane configuration only. + * + * In after build as if did it in form alter, the values are not proccessed. + */ +function views_content_form_views_exposed_form_alter_remove_access($form, $form_state) { + $using_form = FALSE; + foreach ($form['#exposed_form_overrides_filters'] as $filter_id => $filter_info) { + if (empty($form['#exposed_form_overrides']['filters'][$filter_id]) || + ( + ($form['#exposed_form_overrides']['filters'][$filter_id] == 'configureable') && + !$form_state['input']['filter-' . $filter_id]['expose_to_visitor'] + ) + ) { + $form[$filter_id]['#access'] = FALSE; + unset($form['#info']['filter-' . $filter_id]); + if($form[$filter_id . '_op']) { + $form[$filter_id . '_op']['#access'] = FALSE; + unset($form['#info']['filter-' . $filter_id . '-op']); + } + } + else { + $using_form = TRUE; + } + } + // Only provide options if configured to. + if (!empty($form['sort_by']['#options']) && isset($form['#exposed_form_overrides']['sorts'])) { + $form['sort_by']['#options'] = array_intersect_key($form['sort_by']['#options'], array_filter($form['#exposed_form_overrides']['sorts'])); + $count = count($form['sort_by']['#options']); + if ($count == 1) { + $form['sort_by']['#access'] = FALSE; + $form['sort_by']['#value'] = key($form['sort_by']['#options']); + } + elseif (!$count) { + unset($form['sort_by']); + unset($form['sort_order']); + } + } + return $form; +}