# HG changeset patch # User Dan # Date 1237660402 14400 # Node ID 0c3dd4c166c0e957ad5fa936d3bf1278050be28b # Parent d67f43d93f30e1976cd3b872516753e728dfece2 Some fixes to paginator (pagination control code moved to separate function) diff -r d67f43d93f30 -r 0c3dd4c166c0 includes/clientside/static/paginate.js --- a/includes/clientside/static/paginate.js Fri Mar 20 09:15:24 2009 -0400 +++ b/includes/clientside/static/paginate.js Sat Mar 21 14:33:22 2009 -0400 @@ -322,6 +322,7 @@ var offset = ( userinput - 1 ) * perpage; if ( userinput > max || isNaN(userinput) || userinput < 1 ) { + load_component(['messagebox', 'fadefilter', 'flyin']); new MessageBox(MB_OK|MB_ICONSTOP, $lang.get('paginate_err_bad_page_title'), $lang.get('paginate_err_bad_page_body', { max: max })); return false; } diff -r d67f43d93f30 -r 0c3dd4c166c0 includes/functions.php --- a/includes/functions.php Fri Mar 20 09:15:24 2009 -0400 +++ b/includes/functions.php Sat Mar 21 14:33:22 2009 -0400 @@ -2195,6 +2195,127 @@ } /** + * Generates the HTML of a pagination control. + * @param int Current page + * @param int Number of pages + * @param string sprintf()-style formatting URL for pages + * @param int Multiplier for start offset, defaults to 1 + * @param int Add to each $i for addition to result urls, usually either 0 or 1 (depends on whether you want your ?page= to start with 0 ro 1) + * @return string HTML + */ + +function generate_paginator($current_page, $num_pages, $result_url, $start_mult = 1, $start_add = 1) +{ + global $db, $session, $paths, $template, $plugins; // Common objects + global $lang; + + $out = ''; + $i = 0; + + // Build paginator + $pg_css = ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ) ? + // IE-specific hack + 'display: block; width: 1px;': + // Other browsers + 'display: table; margin: 10px 0 0 auto;'; + + $begin = '
+ + '; + $block = ''; + $end = '
' . $lang->get('paginate_lbl_page') . '{LINK}
'; + $blk = $template->makeParserText($block); + $inner = ''; + $cls = 'row2'; + if ( $num_pages < 5 ) + { + for ( $i = 0; $i < $num_pages; $i++ ) + { + $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; + $offset = strval(($i * $start_mult) + $start_add); + $url = htmlspecialchars(sprintf($result_url, $offset)); + $j = $i + 1; + $link = ( $i == $current_page ) ? "$j" : "$j"; + $blk->assign_vars(array( + 'CLASS'=>$cls, + 'LINK'=>$link + )); + $inner .= $blk->run(); + } + } + else + { + if ( $current_page + 5 > $num_pages ) + { + $list = Array(); + $tp = $current_page; + if ( $current_page + 0 == $num_pages ) $tp = $tp - 3; + if ( $current_page + 1 == $num_pages ) $tp = $tp - 2; + if ( $current_page + 2 == $num_pages ) $tp = $tp - 1; + for ( $i = $tp - 1; $i <= $tp + 1; $i++ ) + { + $list[] = $i; + } + } + else + { + $list = Array(); + $current = $current_page; + $lower = ( $current < 3 ) ? 1 : $current - 1; + for ( $i = 0; $i < 3; $i++ ) + { + $list[] = $lower + $i; + } + } + $url = sprintf($result_url, '0'); + $link = ( 0 == $current_page ) ? "" . $lang->get('paginate_btn_first') . "" : "« " . $lang->get('paginate_btn_first') . ""; + $blk->assign_vars(array( + 'CLASS'=>$cls, + 'LINK'=>$link + )); + $inner .= $blk->run(); + + foreach ( $list as $i ) + { + if ( $i == $num_pages ) + break; + $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; + $offset = strval(($i * $start_mult) + $start_add); + $url = sprintf($result_url, $offset); + $j = $i + 1; + $link = ( $i == $current_page ) ? "$j" : "$j"; + $blk->assign_vars(array( + 'CLASS'=>$cls, + 'LINK'=>$link + )); + $inner .= $blk->run(); + } + + // "Last" button + $total = (($num_pages - 1) * $start_mult) + $start_add; + + if ( $current_page < $num_pages ) + { + $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; + $offset = strval($total); + $url = sprintf($result_url, $offset); + $link = ( $num_pages - 1 == $current_page ) ? "" . $lang->get('paginate_btn_last') . "" : "" . $lang->get('paginate_btn_last') . " »"; + $blk->assign_vars(array( + 'CLASS'=>$cls, + 'LINK'=>$link + )); + $inner .= $blk->run(); + } + + } + + $inner .= '↓'; + + $paginator = "\n$begin$inner$end\n"; + return $paginator; +} + +/** * Paginates (breaks into multiple pages) a MySQL result resource, which is treated as unbuffered. * @param resource The MySQL result resource. This should preferably be an unbuffered query. * @param string A template, with variables being named after the column name @@ -2211,124 +2332,15 @@ function paginate($q, $tpl_text, $num_results, $result_url, $start = 0, $perpage = 10, $callers = Array(), $header = '', $footer = '') { global $db, $session, $paths, $template, $plugins; // Common objects - global $lang; $parser = $template->makeParserText($tpl_text); + $num_pages = ceil ( $num_results / $perpage ); $out = ''; + $this_page = ceil ( $start / $perpage ); $i = 0; - $this_page = ceil ( $start / $perpage ); - - // Build paginator - $pg_css = ( strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') ) ? - // IE-specific hack - 'display: block; width: 1px;': - // Other browsers - 'display: table; margin: 10px 0 0 auto;'; - $begin = '
- - '; - $block = ''; - $end = '
' . $lang->get('paginate_lbl_page') . '{LINK}
'; - $blk = $template->makeParserText($block); - $inner = ''; - $cls = 'row2'; - if ( $num_pages < 5 ) - { - for ( $i = 0; $i < $num_pages; $i++ ) - { - $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - $offset = strval($i * $perpage); - $url = htmlspecialchars(sprintf($result_url, $offset)); - $j = $i + 1; - $link = ( $offset == strval($start) ) ? "$j" : "$j"; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - } - } - else - { - if ( $this_page + 5 > $num_pages ) - { - $list = Array(); - $tp = $this_page; - if ( $this_page + 0 == $num_pages ) $tp = $tp - 3; - if ( $this_page + 1 == $num_pages ) $tp = $tp - 2; - if ( $this_page + 2 == $num_pages ) $tp = $tp - 1; - for ( $i = $tp - 1; $i <= $tp + 1; $i++ ) - { - $list[] = $i; - } - } - else - { - $list = Array(); - $current = $this_page; - $lower = ( $current < 3 ) ? 1 : $current - 1; - for ( $i = 0; $i < 3; $i++ ) - { - $list[] = $lower + $i; - } - } - $url = sprintf($result_url, '0'); - $link = ( 0 == $start ) ? "" . $lang->get('paginate_btn_first') . "" : "« " . $lang->get('paginate_btn_first') . ""; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - - // if ( !in_array(1, $list) ) - // { - // $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - // $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...')); - // $inner .= $blk->run(); - // } - - foreach ( $list as $i ) - { - if ( $i == $num_pages ) - break; - $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - $offset = strval($i * $perpage); - $url = sprintf($result_url, $offset); - $j = $i + 1; - $link = ( $offset == strval($start) ) ? "$j" : "$j"; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - } - - $total = $num_pages * $perpage - $perpage; - - if ( $this_page < $num_pages ) - { - // $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - // $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...')); - // $inner .= $blk->run(); - - $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - $offset = strval($total); - $url = sprintf($result_url, $offset); - $j = $i + 1; - $link = ( $offset == strval($start) ) ? "" . $lang->get('paginate_btn_last') . "" : "" . $lang->get('paginate_btn_last') . " »"; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - } - - } - - $inner .= '↓'; - - $paginator = "\n$begin$inner$end\n"; + + $paginator = generate_paginator($this_page, $num_pages, $result_url, $perpage, 0); $out .= $paginator; $cls = 'row2'; @@ -2394,138 +2406,9 @@ $i = 0; $this_page = ceil ( $start / $perpage ); - // Build paginator - $begin = '
- - '; - $block = ''; - $end = '
' . $lang->get('paginate_lbl_page') . '{LINK}
'; - $blk = $template->makeParserText($block); - $inner = ''; - $cls = 'row2'; - $total = $num_pages * $perpage - $perpage; - /* - if ( $start > 0 ) - { - $url = sprintf($result_url, abs($start - $perpage)); - $link = "« " . $lang->get('paginate_btn_prev') . ""; - $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - } - */ - if ( $num_pages < 5 ) - { - for ( $i = 0; $i < $num_pages; $i++ ) - { - $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - $offset = strval($i * $perpage); - $url = htmlspecialchars(sprintf($result_url, $offset)); - $j = $i + 1; - $link = ( $offset == strval($start) ) ? "$j" : "$j"; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - } - } - else - { - if ( $this_page + 5 > $num_pages ) - { - $list = Array(); - $tp = $this_page; - if ( $this_page + 0 == $num_pages ) $tp = $tp - 3; - if ( $this_page + 1 == $num_pages ) $tp = $tp - 2; - if ( $this_page + 2 == $num_pages ) $tp = $tp - 1; - for ( $i = $tp - 1; $i <= $tp + 1; $i++ ) - { - $list[] = $i; - } - } - else - { - $list = Array(); - $current = $this_page; - $lower = ( $current < 3 ) ? 1 : $current - 1; - for ( $i = 0; $i < 3; $i++ ) - { - $list[] = $lower + $i; - } - } - $url = sprintf($result_url, '0'); - $link = ( 0 == $start ) ? "" . $lang->get('paginate_btn_first') . "" : "« " . $lang->get('paginate_btn_first') . ""; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - - // if ( !in_array(1, $list) ) - // { - // $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - // $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...')); - // $inner .= $blk->run(); - // } - - foreach ( $list as $i ) - { - if ( $i == $num_pages ) - break; - $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - $offset = strval($i * $perpage); - $url = sprintf($result_url, $offset); - $j = $i + 1; - $link = ( $offset == strval($start) ) ? "$j" : "$j"; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - } - - if ( $this_page < $num_pages ) - { - // $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - // $blk->assign_vars(array('CLASS'=>$cls,'LINK'=>'...')); - // $inner .= $blk->run(); - - $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - $offset = strval($total); - $url = sprintf($result_url, $offset); - $j = $i + 1; - $link = ( $offset == strval($start) ) ? "" . $lang->get('paginate_btn_last') . "" : "" . $lang->get('paginate_btn_last') . " »"; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - } - - } - - /* - if ( $start < $total ) - { - $link_offset = abs($start + $perpage); - $url = htmlspecialchars(sprintf($result_url, strval($link_offset))); - $link = "" . $lang->get('paginate_btn_next') . " »"; - $cls = ( $cls == 'row1' ) ? 'row2' : 'row1'; - $blk->assign_vars(array( - 'CLASS'=>$cls, - 'LINK'=>$link - )); - $inner .= $blk->run(); - } - */ - - $inner .= '↓'; - - $paginator = "\n$begin$inner$end\n"; + $paginator = generate_paginator($this_page, $num_pages, $result_url, $perpage, 0); + $out .= $paginator; + if ( $total > 1 ) { $out .= $paginator;