? pager.inc.patch Index: pager.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/pager.inc,v retrieving revision 1.62 diff -u -p -r1.62 pager.inc --- pager.inc 2 Aug 2007 10:58:41 -0000 1.62 +++ pager.inc 13 Aug 2007 18:22:07 -0000 @@ -65,13 +65,27 @@ function pager_query($query, $limit = 10 $count_query = preg_replace(array('/SELECT.*?FROM /As', '/ORDER BY .*/'), array('SELECT COUNT(*) FROM ', ''), $query); } - // Convert comma-separated $page to an array, used by other functions. - $pager_page_array = explode(',', $page); + // Set up our initial $pager_page_array if needed. + if (!isset($pager_page_array)) { + $pager_page_array = array(); + // Convert comma-separated $page to an array, used by other functions. + $temp_page_array = explode(',', $page); + foreach ($temp_page_array as $k => $v) { + // Convert the array to integer, and substitute -1 for "last". + $pager_page_array[$k] = (int) ($v=='last') ? -1 : $v; + } + } // We calculate the total of pages as ceil(items / limit). $pager_total_items[$element] = db_result(db_query($count_query, $args)); $pager_total[$element] = ceil($pager_total_items[$element] / $limit); - $pager_page_array[$element] = max(0, min((int)$pager_page_array[$element], ((int)$pager_total[$element]) - 1)); + + // Handle negative numbers as indexes from the end. + if ($pager_page_array[$element] < 0) { + $pager_page_array[$element] = max(0, (int)$pager_total[$element] + $pager_page_array[$element]); + } else { + $pager_page_array[$element] = max(0, min($pager_page_array[$element], ((int)$pager_total[$element]) - 1)); + } return db_query_range($query, $args, $pager_page_array[$element] * $limit, $limit); }