'. t('Add theme hook \'drpager\' to format pager with text field.') .'

'; $output[] = '

'. t('Can be configured to replaced the built-in \'pager\' and Views\' \'views_mini_pager\' theme hook at the administration settings page' ) .'

'; return implode("\n", $output); } } function drpager_menu() { $items['admin/settings/drpager'] = array( 'title' => 'Minimax pager', 'description' => 'Settings for the drpager module', 'page callback' => 'drupal_get_form', 'page arguments' => array('drpager_settings_form'), 'access arguments' => array('administer site configuration'), 'type' => MENU_NORMAL_ITEM, 'file' => 'drpager.admin.inc', ); return $items; } function drpager_theme() { return array( 'drpager' => array( 'arguments' => array('tags' => array(), 'limit' => 10, 'element' => 0, 'parameters' => array()), ), 'drpagera' => array( 'arguments' => array('tags' => array(), 'limit' => 10, 'element' => 0, 'parameters' => array()), ), 'drpager_mini' => array( 'arguments' => array('tags' => array(), 'limit' => 10, 'element' => 0, 'parameters' => array()), ), 'drpager_full' => array( 'arguments' => array('tags' => array(), 'limit' => 10, 'element' => 0, 'parameters' => array()), ), ); } /** * "Adaptive" drpager: depending on the adaptive_value setting in the admin page, if the number * of pages are less than or equals to that value, display the full pager, else switch to drpager. */ function theme_drpagera($tags = array(), $limit = 10, $element = 0, $parameters = array(), $quantity = 9) { global $pager_total; if ($pager_total[$element] > 1) { $adaptive_value = variable_get('drpager_adaptive_value', 0); if ($adaptive_value == 0 || ($adaptive_value > 0 && $pager_total[$element] > $adaptive_value)) { return theme('drpager', $tags, $limit, $element, $parameters, $quantity); } else { return theme('drpager_full', $tags, $limit, $element, $parameters, $quantity); } } } /** * A mini version of drpager that defaults to short link labels */ function theme_drpager_mini($tags = array(), $limit = 10, $element = 0, $parameters = array(), $quantity = 9) { global $pager_total; if ($pager_total[$element] > 1) { if ($tags == array()) { $tags = array( 0 => t('«'), 1 => t('‹'), 3 => t('›'), 4 => t('»'), ); } return theme_drpager($tags, $limit, $element, $parameters, $quantity); } } function theme_drpager($tags = array(), $limit = 10, $element = 0, $parameters = array(), $quantity = 9) { global $pager_page_array, $pager_total; if ($pager_total[$element] > 1) { if (variable_get('drpager_use_short_link_label', FALSE) && $tags == array()) { $tags = array( 0 => t('«'), 1 => t('‹'), 3 => t('›'), 4 => t('»'), ); } // Calculate various markers within this pager piece: // Middle is used to "center" pages around the current page. $pager_middle = ceil($quantity / 2); // current is the page we are currently paged to $pager_current = $pager_page_array[$element] + 1; // first is the first page listed by this pager piece (re quantity) $pager_first = $pager_current - $pager_middle + 1; // last is the last page listed by this pager piece (re quantity) $pager_last = $pager_current + $quantity - $pager_middle; // max is the maximum page number $pager_max = $pager_total[$element]; // End of marker calculations. $li_first = theme('pager_first', (isset($tags[0]) ? $tags[0] : t('« first')), $limit, $element, $parameters); $li_previous = theme('pager_previous', (isset($tags[1]) ? $tags[1] : t('‹ previous')), $limit, $element, 1, $parameters); $li_next = theme('pager_next', (isset($tags[3]) ? $tags[3] : t('next ›')), $limit, $element, 1, $parameters); $li_last = theme('pager_last', (isset($tags[4]) ? $tags[4] : t('last »')), $limit, $element, $parameters); if ($li_first) { $items[] = array( 'class' => 'pager-first', 'data' => $li_first, ); } if ($li_previous) { $items[] = array( 'class' => 'pager-previous', 'data' => $li_previous, ); } $items[] = array( 'class' => 'drpager', 'data' => drpager_widget($element, $pager_current, $pager_max, $parameters), ); if ($li_next) { $items[] = array( 'class' => 'pager-next', 'data' => $li_next, ); } if ($li_last) { $items[] = array( 'class' => 'pager-last', 'data' => $li_last, ); } return theme('item_list', $items, NULL, 'ul', array('class' => 'pager')); } } /** * Exactly the same as the original pager except the "current page" is a text input box * to jump to a specific page directly. */ function theme_drpager_full($tags = array(), $limit = 10, $element = 0, $parameters = array(), $quantity = 9) { global $pager_page_array, $pager_total; if (variable_get('drpager_use_short_link_label', FALSE) && $tags == array()) { $tags = array( 0 => t('«'), 1 => t('‹'), 3 => t('›'), 4 => t('»'), ); } // Calculate various markers within this pager piece: // Middle is used to "center" pages around the current page. $pager_middle = ceil($quantity / 2); // current is the page we are currently paged to $pager_current = $pager_page_array[$element] + 1; // first is the first page listed by this pager piece (re quantity) $pager_first = $pager_current - $pager_middle + 1; // last is the last page listed by this pager piece (re quantity) $pager_last = $pager_current + $quantity - $pager_middle; // max is the maximum page number $pager_max = $pager_total[$element]; // End of marker calculations. // Prepare for generation loop. $i = $pager_first; if ($pager_last > $pager_max) { // Adjust "center" if at end of query. $i = $i + ($pager_max - $pager_last); $pager_last = $pager_max; } if ($i <= 0) { // Adjust "center" if at start of query. $pager_last = $pager_last + (1 - $i); $i = 1; } // End of generation loop preparation. $li_first = theme('pager_first', (isset($tags[0]) ? $tags[0] : t('« first')), $limit, $element, $parameters); $li_previous = theme('pager_previous', (isset($tags[1]) ? $tags[1] : t('‹ previous')), $limit, $element, 1, $parameters); $li_next = theme('pager_next', (isset($tags[3]) ? $tags[3] : t('next ›')), $limit, $element, 1, $parameters); $li_last = theme('pager_last', (isset($tags[4]) ? $tags[4] : t('last »')), $limit, $element, $parameters); if ($pager_total[$element] > 1) { if ($li_first) { $items[] = array( 'class' => 'pager-first', 'data' => $li_first, ); } if ($li_previous) { $items[] = array( 'class' => 'pager-previous', 'data' => $li_previous, ); } // When there is more than one page, create the pager list. if ($i != $pager_max) { if ($i > 1) { $items[] = array( 'class' => 'pager-ellipsis', 'data' => '…', ); } // Now generate the actual pager piece. for (; $i <= $pager_last && $i <= $pager_max; $i++) { if ($i < $pager_current) { $items[] = array( 'class' => 'pager-item', 'data' => theme('pager_previous', $i, $limit, $element, ($pager_current - $i), $parameters), ); } if ($i == $pager_current) { $items[] = array( 'class' => 'pager-current', 'data' => drpager_widget($element, $pager_current, $pager_max, $parameters), ); } if ($i > $pager_current) { $items[] = array( 'class' => 'pager-item', 'data' => theme('pager_next', $i, $limit, $element, ($i - $pager_current), $parameters), ); } } if ($i < $pager_max) { $items[] = array( 'class' => 'pager-ellipsis', 'data' => '…', ); } } // End generation. if ($li_next) { $items[] = array( 'class' => 'pager-next', 'data' => $li_next, ); } if ($li_last) { $items[] = array( 'class' => 'pager-last', 'data' => $li_last, ); } return theme('item_list', $items, NULL, 'ul', array('class' => 'pager')); } } function drpager_widget($element, $page_current, $page_total, $parameters) { drupal_add_css(drupal_get_path('module', 'drpager') .'/drpager.css'); drupal_add_js(drupal_get_path('module', 'drpager') .'/drpager-min.js'); // construct the query string exactly like the pager global $pager_page_array; $page_new = pager_load_array($page_current - 1, $element, $pager_page_array); $page_new[$element] = 'drpagerpage'; $parameters['page'] = implode(',', $page_new); $query = array(); if (count($parameters)) { $query[] = drupal_query_string_encode($parameters, array()); } $querystring = pager_get_querystring(); if ($querystring != '') { $query[] = $querystring; } $drpager_query = implode('&', $query); $url = base_path() . (variable_get('clean_url', 0) ? $_GET['q'] .'?' : '?q='. $_GET['q'] .'&') . $drpager_query; $state = drupal_to_js(array('url' => $url, 'total' => $page_total)); $title = t('Set page number to go to then press enter'); return t('!page of %total', array('!page' => "", '%total' => $page_total, )); } // kick off a theme registry rebuild, called when our setting has changed function _drpager_reset($form, &$form_state) { init_theme(); $theme_registry = theme_get_registry(); if (variable_get('drpager_replace_pager', FALSE) && $theme_registry['pager']['function'] != 'theme_drpager' && $theme_registry['pager']['function'] != 'theme_drpagera') { drupal_set_message(t('Drpager will override pager.')); } if (variable_get('drpager_replace_views_mini_pager', FALSE) && $theme_registry['views_mini_pager']['function'] != 'theme_drpager_mini') { drupal_set_message(t('Drpager will override views_mini_pager.')); } // Re-build theme registry, this will invoke our hook_theme_registry_alter() drupal_rebuild_theme_registry(); } function drpager_theme_registry_alter(&$theme_registry) { // replace the built-in pager only if this option is set and this theme hook is not overridden if (variable_get('drpager_replace_pager', FALSE) && 'theme_pager' == $theme_registry['pager']['function']) { // $replacement = variable_get('drpager_adaptive_value', 0) > 0 ? 'theme_drpagera' : 'theme_drpager'; $replacement = variable_get('drpager_adaptive_value', 0) != 0 ? $theme_registry['drpagera']['function'] : $theme_registry['drpager']['function']; // we will use our theme_drpager_full() instead of the original pager // $theme_registry['drpager_pager_save'] = $theme_registry['pager']; $theme_registry['pager']['theme path'] = drupal_get_path('module', 'drpager'); $theme_registry['pager']['function'] = $replacement; unset($theme_registry['pager']['template']); } if (variable_get('drpager_replace_views_mini_pager', FALSE)) { $theme_registry['views_mini_pager']['theme path'] = drupal_get_path('module', 'drpager'); $theme_registry['views_mini_pager']['function'] = 'theme_drpager_mini'; unset($theme_registry['views_mini_pager']['file']); unset($theme_registry['views_mini_pager']['path']); unset($theme_registry['views_mini_pager']['template']); } }