diff --git plugins/views_plugin_display.inc plugins/views_plugin_display.inc index 3a8b959..38b13f4 100644 --- plugins/views_plugin_display.inc +++ plugins/views_plugin_display.inc @@ -118,6 +118,11 @@ class views_plugin_display extends views_plugin { } } } + $pager = $this->get_plugin('pager'); + if (isset($pager) && $pager->uses_exposed()) { + $this->has_exposed = TRUE; + return TRUE; + } $this->has_exposed = FALSE; } diff --git plugins/views_plugin_exposed_form.inc plugins/views_plugin_exposed_form.inc index d64e5e0..8d2e3d9 100644 --- plugins/views_plugin_exposed_form.inc +++ plugins/views_plugin_exposed_form.inc @@ -181,9 +181,19 @@ class views_plugin_exposed_form extends views_plugin { $form['reset']['#weight'] = 10; } } + + $pager = $this->view->display_handler->get_plugin('pager'); + if ($pager) { + $pager->exposed_form_alter($form, $form_state); + $form_state['pager_plugin'] = $pager; + } } - function exposed_form_validate(&$form, &$form_state) { } + function exposed_form_validate(&$form, &$form_state) { + if (isset($form_state['pager_plugin'])) { + $form_state['pager_plugin']->exposed_form_validate($form, $form_state); + } + } /** * This function is executed when exposed form is submited. @@ -200,6 +210,10 @@ class views_plugin_exposed_form extends views_plugin { if (!empty($form_state['values']['op']) && $form_state['values']['op'] == t('Reset')) { $this->reset_form($form, $form_state); } + if (isset($form_state['pager_plugin'])) { + $form_state['pager_plugin']->exposed_form_submit($form, $form_state, $exclude); + $exclude[] = 'pager_plugin'; + } } /** diff --git plugins/views_plugin_pager.inc plugins/views_plugin_pager.inc index 466db6a..3d4fadc 100644 --- plugins/views_plugin_pager.inc +++ plugins/views_plugin_pager.inc @@ -186,4 +186,22 @@ class views_plugin_pager extends views_plugin { return $this->get_items_per_page() && $this->total_items > (intval($this->current_page) + 1) * $this->get_items_per_page(); } + + function exposed_form_alter(&$form, &$form_state) { } + + function exposed_form_validate(&$form, &$form_state) { } + + function exposed_form_submit(&$form, &$form_state, &$exclude) { } + + function uses_exposed() { + return FALSE; + } + + function items_per_page_exposed() { + return FALSE; + } + + function offset_exposed() { + return FALSE; + } } diff --git plugins/views_plugin_pager_full.inc plugins/views_plugin_pager_full.inc index 7abf211..b977c90 100644 --- plugins/views_plugin_pager_full.inc +++ plugins/views_plugin_pager_full.inc @@ -20,7 +20,16 @@ class views_plugin_pager_full extends views_plugin_pager { $options['offset'] = array('default' => 0); $options['id'] = array('default' => 0); $options['total_pages'] = array('default' => ''); + $options['expose'] = array( + 'contains' => array( + 'items_per_page' => array('default' => FALSE, 'bool' => TRUE), + 'items_per_page_label' => array('default' => 'Items per page', 'translatable' => TRUE), + 'items_per_page_options' => array('default' => '5, 10, 20, 40, 60'), + 'offset' => array('default' => FALSE, 'bool' => TRUE), + 'offset_label' => array('default' => 'Offset', 'translatable' => TRUE), + ), + ); return $options; } @@ -55,9 +64,103 @@ class views_plugin_pager_full extends views_plugin_pager { '#description' => t('The total number of pages. Leave empty to show all pages.'), '#default_value' => $this->options['total_pages'], ); + + $form['expose'] = array ( + '#type' => 'fieldset', + '#collapsible' => FALSE, + '#collapsed' => FALSE, + '#tree' => TRUE, + '#title' => t('Exposed options'), + '#input' => TRUE, + '#description' => t('Exposing this options allows users to define their values in a exposed form when view is displayed'), + ); + + $form['expose']['items_per_page'] = array( + '#type' => 'checkbox', + '#title' => t('Expose items per page'), + '#description' => t('When checked, users can determine how many items per page show in a view'), + '#default_value' => $this->options['expose']['items_per_page'], + ); + + $form['expose']['items_per_page_label'] = array( + '#type' => 'textfield', + '#title' => t('Items per page label'), + '#required' => TRUE, + '#description' => t('Label to use in the exposed items per page form element.'), + '#default_value' => $this->options['expose']['items_per_page_label'], + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-pager-options-expose-items-per-page' => array(1) + ), + ); + + $form['expose']['items_per_page_options'] = array( + '#type' => 'textfield', + '#title' => t('Exposed items per page options'), + '#required' => TRUE, + '#description' => t('Set between which values the user can choose when determining the items per page. Separated by colon.'), + '#default_value' => $this->options['expose']['items_per_page_options'], + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-pager-options-expose-items-per-page' => array(1) + ), + ); + + $form['expose']['offset'] = array( + '#type' => 'checkbox', + '#title' => t('Expose Offset'), + '#description' => t('When checked, users can determine how many items per page show in a view'), + '#default_value' => $this->options['expose']['items_per_page'], + ); + + $form['expose']['offset_label'] = array( + '#type' => 'textfield', + '#title' => t('Offset label'), + '#required' => TRUE, + '#description' => t('Label to use in the exposed offset form element.'), + '#default_value' => $this->options['expose']['offset_label'], + '#process' => array('views_process_dependency'), + '#dependency' => array( + 'edit-pager-options-expose-offset' => array(1) + ), + ); + } + + function options_validate(&$form, &$form_state) { + // Only accept integer values. + $error = FALSE; + $exposed_options = $form_state['values']['pager_options']['expose']['items_per_page_options']; + if (strpos($exposed_options, '.') !== FALSE) { + $error = TRUE; + } + $options = explode(',',$exposed_options); + if (!$error && is_array($options)) { + foreach ($options as $option) { + if (!is_numeric($option) || intval($option) == 0) { + $error = TRUE; + } + } + } + else { + $error = TRUE; + } + if ($error) { + form_set_error('pager_options][expose][items_per_page_options', t('Please insert a list of integer numeric values separated by colons: e.g: 10, 20, 50, 100')); + } } function query() { + if ($this->items_per_page_exposed()) { + if (!empty($_GET['items_per_page']) && $_GET['items_per_page'] > 0){ + $this->options['items_per_page'] = $_GET['items_per_page']; + } + } + if ($this->offset_exposed()) { + if (isset($_GET['offset']) && $_GET['offset'] >= 0){ + $this->options['offset'] = $_GET['offset']; + } + } + $limit = $this->options['items_per_page']; $offset = $this->current_page * $this->options['items_per_page'] + $this->options['offset']; if (!empty($this->options['total_pages'])) { @@ -136,4 +239,53 @@ class views_plugin_pager_full extends views_plugin_pager { // goes to look for it later. $pager_page_array[$this->options['id']] = $this->current_page; } + + function uses_exposed() { + return $this->items_per_page_exposed() || $this->offset_exposed(); + } + + function items_per_page_exposed() { + return !empty($this->options['expose']['items_per_page']); + } + + function offset_exposed() { + return !empty($this->options['expose']['offset']); + } + + function exposed_form_alter(&$form, &$form_state) { + if ($this->items_per_page_exposed()) { + $options = explode(',', $this->options['expose']['items_per_page_options']); + $sanitized_options = array(); + if (is_array($options)) { + foreach ($options as $option) { + $sanitized_options[intval($option)] = intval($option); + } + + $form['items_per_page'] = array( + '#type' => 'select', + '#title' => $this->options['expose']['items_per_page_label'], + '#options' => $sanitized_options, + '#default_value' => $this->get_items_per_page(), + ); + } + } + + if ($this->offset_exposed()) { + $form['offset'] = array( + '#type' => 'textfield', + '#size' => 10, + '#maxlength' => 10, + '#title' => $this->options['expose']['offset_label'], + '#default_value' => $this->get_offset(), + ); + } + } + + function exposed_form_validate(&$form, &$form_state) { + if (!empty($form_state['values']['offset']) && trim($form_state['values']['offset'])) { + if (!is_numeric($form_state['values']['offset']) || $form_state['values']['offset'] < 0) { + form_set_error('offset', t('Offset must be an number greather or equal than 0.')); + } + } + } } diff --git theme/theme.inc theme/theme.inc index ed4526c..817a361 100644 --- theme/theme.inc +++ theme/theme.inc @@ -593,6 +593,19 @@ function template_preprocess_views_exposed_form(&$vars) { unset($form['form_build_id']); unset($form['form_token']); + if (isset($form['sort_by'])) { + $vars['sort_by'] = drupal_render($form['sort_by']); + $vars['sort_order'] = drupal_render($form['sort_order']); + } + if (isset($form['items_per_page'])) { + $vars['items_per_page'] = drupal_render($form['items_per_page']); + } + if (isset($form['offset'])) { + $vars['offset'] = drupal_render($form['offset']); + } + if (isset($form['reset'])) { + $vars['reset_button'] = drupal_render($form['reset']); + } // This includes the submit button. $vars['button'] = drupal_render($form); } diff --git theme/views-exposed-form.tpl.php theme/views-exposed-form.tpl.php index f4c5861..01cfc4d 100644 --- theme/views-exposed-form.tpl.php +++ theme/views-exposed-form.tpl.php @@ -10,6 +10,11 @@ * - $widget->label: The visible label to print. May be optional. * - $widget->operator: The operator for the widget. May be optional. * - $widget->widget: The widget itself. + * - $sort_by: The select box to sort the view using an exposed form. + * - $sort_order: The select box with the ASC, DESC options to define order. May be optional. + * - $items_per_page: The select box with the available items per page. May be optional. + * - $offset: A textfield to define the offset of the view. May be optional. + * - $reset_button: A button to reset the exposed filter applied. May be optional. * - $button: The submit button for the form. * * @ingroup views_templates @@ -41,8 +46,31 @@ + +
+ + endif; ?> + + + endif; ?> + + + endif; ?> + + + endif; ?> - \ No newline at end of file + diff --git views.module views.module index 159e59e..54d075c 100644 --- views.module +++ views.module @@ -1011,7 +1011,7 @@ function views_exposed_form(&$form_state) { $form['submit'] = array( '#name' => '', // prevent from showing up in $_GET. '#type' => 'submit', - '#value' => t('Submit'), + '#value' => t('Apply'), '#id' => form_clean_id('edit-submit-' . $view->name), );