cvs: pearweb /include Pager.php /public_html package-search.php

From: Date: Tue, 12 Feb 2002 15:23:47 +0000
Subject: cvs: pearweb /include Pager.php /public_html package-search.php
Groups: php.pear.cvs 
Request: Send a blank email to pear-cvs+get-2399@lists.php.net to get a copy of this message
heyesr Tue Feb 12 10:23:47 2002 EDT Added files: /pearweb/include Pager.php Modified files: /pearweb/public_html package-search.php Log: * Added paging

Index: pearweb/public_html/package-search.php diff -u pearweb/public_html/package-search.php:1.8 pearweb/public_html/package-search.php:1.9 --- pearweb/public_html/package-search.php:1.8 Tue Jan 29 07:08:25 2002 +++ pearweb/public_html/package-search.php Tue Feb 12 10:23:47 2002 @@ -5,8 +5,6 @@ /* * TODO -* - Use coxs pager class -* - Show all packages when no search terms entered or not? * - More stuff to search on, eg summary, version */ @@ -100,11 +98,29 @@ $result = $dbh->query($sql); // Print any results - if($result->numRows() > 0) { + if (($numrows = $result->numRows()) > 0) { + + // Paging + include_once('Pager.php'); + $params['itemData'] = range(0, $numrows - 1); + $pager =& new Pager($params); + list($from, $to) = $pager->getOffsetByPageId(); + $links = $pager->getLinks('<nobr><< Prev</nobr>', '<nobr>Next >></nobr>'); + + // Row number + $rownum = $from - 1; + echo "<br /><br />\n"; - $bb = new Borderbox("Search results (" . $result->numRows() . ")"); + + // Title of borderbox + $title_html = '<table border="0" width="100%" cellspacing="0" cellpadding="0"><tr>'; + $title_html .= '<td align="left" width="1">' . $links['back'] . '</td>'; + $title_html .= '<td>Search results (' . $from . ' - ' . $to . ' of ' . $numrows . ')</td>'; + $title_html .= '<td align="right" width="1">' . $links['next'] . '</td></tr></table>'; + + $bb = new Borderbox($title_html); - while($result->fetchInto($row)) { + while ($result->fetchInto($row, DB_FETCHMODE_ASSOC, $rownum++) AND $rownum <= $to) { echo ' <dt><a href="package-info.php?pacid='.$row['id'].'">'.$row['name'].'</a> (<a href="/account-info.php?handle='.$row['handle'].'">'.$row['handle'].'</a>)</dt>'; echo ' <dd>'.$row['summary'].'</dd>'; echo ' <br /><br />'; Index: pearweb/include/Pager.php +++ pearweb/include/Pager.php <?php // +----------------------------------------------------------------------+ // | PHP Version 4 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997-2002 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.02 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Richard Heyes <richard@phpguru.org> | // +----------------------------------------------------------------------+ /** * Pager class * * Handles paging a set of data. For usage see the example.php provided. * */ class Pager { /** * Current page * @var integer */ var $_currentPage; /** * Items per page * @var integer */ var $_perPage; /** * Total number of pages * @var integer */ var $_totalPages; /** * Item data. Numerically indexed array... * @var array */ var $_itemData; /** * Total number of items in the data * @var integer */ var $_totalItems; /** * Page data generated by this class * @var array */ var $_pageData; /** * Constructor * * Sets up the object and calculates the total number of items. * * @param $params An associative array of parameters This can contain: * currentPage Current Page number (optional) * perPage Items per page (optional) * itemData Data to page */ function pager($params = array()) { global $HTTP_GET_VARS; $this->_currentPage = max((int)@$HTTP_GET_VARS['pageID'], 1); $this->_perPage = 10; $this->_itemData = array(); foreach ($params as $name => $value) { $this->{'_' . $name} = $value; } $this->_totalItems = count($this->_itemData); } /** * Returns an array of current pages data * * @param $pageID Desired page ID (optional) * @return array Page data */ function getPageData($pageID = null) { if (isset($pageID)) { if (!empty($this->_pageData[$pageID])) { return $this->_pageData[$pageID]; } else { return FALSE; } } if (!isset($this->_pageData)) { $this->_generatePageData(); } return $this->getPageData($this->_currentPage); } /** * Returns pageID for given offset * * @param $index Offset to get pageID for * @return int PageID for given offset */ function getPageIdByOffset($index) { if (!isset($this->_pageData)) { $this->_generatePageData(); } if (($index % $this->_perPage) > 0) { $pageID = ceil((float)$index / (float)$this->_perPage); } else { $pageID = $index / $this->_perPage; } return $pageID; } /** * Returns offsets for given pageID. Eg, if you * pass it pageID one and your perPage limit is 10 * it will return you 1 and 10. PageID of 2 would * give you 11 and 20. * * @params pageID PageID to get offsets for * @return array First and last offsets */ function getOffsetByPageId($pageid = null) { $pageid = isset($pageid) ? $pageid : $this->_currentPage; if (!isset($this->_pageData)) { $this->_generatePageData(); } if (isset($this->_pageData[$pageid])) { return array(($this->_perPage * ($pageid - 1)) + 1, min($this->_totalItems, $this->_perPage * $pageid)); } else { return array(0,0); } } /** * Returns back/next and page links * * @param $back_html HTML to put inside the back link * @param $next_html HTML to put inside the next link * @return array Back/pages/next links */ function getLinks($back_html = '<< Back', $next_html = 'Next >>') { $url = $this->_getLinksUrl(); $back = $this->_getBackLink($url, $back_html); $pages = $this->_getPageLinks($url); $next = $this->_getNextLink($url, $next_html); return array($back, $pages, $next, 'back' => $back, 'pages' => $pages, 'next' => $next); } /** * Returns number of pages * * @return int Number of pages */ function numPages() { return $this->_totalPages; } /** * Returns whether current page is first page * * @return bool First page or not */ function isFirstPage() { return ($this->_currentPage == 1); } /** * Returns whether current page is last page * * @return bool Last page or not */ function isLastPage() { return ($this->_currentPage == $this->_totalPages); } /** * Returns whether last page is complete * * @return bool Last age complete or not */ function isLastPageComplete() { return !($this->_totalItems % $this->_perPage); } /** * Calculates all page data */ function _generatePageData() { $this->_totalItems = count($this->_itemData); $this->_totalPages = ceil((float)$this->_totalItems / (float)$this->_perPage); $i = 1; if (!empty($this->_itemData)) { foreach ($this->_itemData as $value) { $this->_pageData[$i][] = $value; if (count($this->_pageData[$i]) >= $this->_perPage) { $i++; } } } else { $this->_pageData = array(); } } /** * Returns the correct link for the back/pages/next links * * @return string Url */ function _getLinksUrl() { global $HTTP_SERVER_VARS; // Sort out query string to prevent messy urls $querystring = array(); if (!empty($HTTP_SERVER_VARS['QUERY_STRING'])) { $qs = explode('&', $HTTP_SERVER_VARS['QUERY_STRING']); for ($i = 0, $cnt = count($qs); $i < $cnt; $i++) { list($name, $value) = explode('=', $qs[$i]); if ($name != 'pageID') { $qs[$name] = $value; } unset($qs[$i]); } } foreach ($qs as $name => $value) { $querystring[] = $name . '=' . $value; } return $HTTP_SERVER_VARS['SCRIPT_NAME'] . '?' . implode('&', $querystring) . (!empty($querystring) ? '&' : '') . 'pageID='; } /** * Returns back link * * @param $url URL to use in the link * @param $link HTML to use as the link * @return string The link */ function _getBackLink($url, $link = '<< Back') { // Back link if ($this->_currentPage > 1) { $back = '<a href="' . $url . ($this->_currentPage - 1) . '">' . $link . '</a>'; } else { $back = ''; } return $back; } /** * Returns pages link * * @param $url URL to use in the link * @return string Links */ function _getPageLinks($url) { // Create the range $params['itemData'] = range(1, max(1, $this->_totalPages)); $pager =& new Pager($params); $links = $pager->getPageData($pager->getPageIdByOffset($this->_currentPage)); for ($i=0; $i<count($links); $i++) { if ($links[$i] != $this->_currentPage) { $links[$i] = '<a href="' . $this->_getLinksUrl() . $links[$i] . '">' . $links[$i] . '</a>'; } } return implode(' ', $links); } /** * Returns next link * * @param $url URL to use in the link * @param $link HTML to use as the link * @return string The link */ function _getNextLink($url, $link = 'Next >>') { if ($this->_currentPage < $this->_totalPages) { $next = '<a href="' . $url . ($this->_currentPage + 1) . '">' . $link . '</a>'; } else { $next = ''; } return $next; } } ?>
« previous php.pear.cvs (#2399) next »