From: Reini U. <ru...@us...> - 2004-07-09 10:07:01
|
Update of /cvsroot/phpwiki/phpwiki/lib/WikiDB In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv28395/WikiDB Modified Files: backend.php Log Message: Use backend specific sortby and sortable_columns method, to be able to select between native (Db backend) and custom (PageList) sorting. Fixed PageList::AddPageList (missed the first) Added the author/creator.. name to AllPagesBy... display no pages if none matched. Improved dba and file sortby(). Use &$request reference Index: backend.php =================================================================== RCS file: /cvsroot/phpwiki/phpwiki/lib/WikiDB/backend.php,v retrieving revision 1.8 retrieving revision 1.9 diff -u -2 -b -p -d -r1.8 -r1.9 --- backend.php 21 Jun 2004 16:22:32 -0000 1.8 +++ backend.php 9 Jul 2004 10:06:49 -0000 1.9 @@ -281,5 +281,5 @@ class WikiDB_backend * @return object A WikiDB_backend_iterator. */ - function get_all_pages($include_defaulted, $orderby) { + function get_all_pages($include_defaulted, $orderby=false, $limit=false) { trigger_error("virtual", E_USER_ERROR); } @@ -324,5 +324,5 @@ class WikiDB_backend * @return object A WikiDB_backend_iterator. */ - function most_popular($limit,$sortby = '') { + function most_popular($limit) { // This is method fetches all pages, then // sorts them by hit count. @@ -332,5 +332,5 @@ class WikiDB_backend // method with something more efficient. include_once('lib/WikiDB/backend/dumb/MostPopularIter.php'); - $pages = $this->get_all_pages(false,'hits DESC'); + $pages = $this->get_all_pages(false, 'hits DESC', $limit); return new WikiDB_backend_dumb_MostPopularIter($this, $pages, $limit); @@ -445,4 +445,74 @@ class WikiDB_backend } + /** + * Split the given limit parameter into offset,pagesize. (offset is optional. default: 0) + * Duplicate the PageList function here to avoid loading the whole PageList.php + * Usage: + * list($offset,$pagesize) = $this->limit($args['limit']); + */ + function limit($limit) { + if (strstr($limit, ',')) + return split(',', $limit); + else + return array(0, $limit); + } + + /** + * Handle sortby requests for the DB iterator and table header links. + * Prefix the column with + or - like "+pagename","-mtime", ... + * supported actions: 'flip_order' "mtime" => "+mtime" => "-mtime" ... + * 'db' "-pagename" => "pagename DESC" + * In PageList all columns are sortable. (patch by DanFr) + * Here with the backend only some, the rest is delayed to PageList. + * (some kind of DumbIter) + * Duplicate the PageList function here to avoid loading the whole + * PageList.php, and it forces the backend specific sortable_columns() + */ + function sortby ($column, $action) { + if (empty($column)) return ''; + //support multiple comma-delimited sortby args: "+hits,+pagename" + if (strstr($column,',')) { + $result = array(); + foreach (explode(',',$column) as $col) { + $result[] = $this->sortby($col,$action); + } + return join(",",$result); + } + if (substr($column,0,1) == '+') { + $order = '+'; $column = substr($column,1); + } elseif (substr($column,0,1) == '-') { + $order = '-'; $column = substr($column,1); + } + // default order: +pagename, -mtime, -hits + if (empty($order)) + if (in_array($column,array('mtime','hits'))) + $order = '-'; + else + $order = '+'; + if ($action == 'flip_order') { + return ($order == '+' ? '-' : '+') . $column; + } elseif ($action == 'init') { + $this->_sortby[$column] = $order; + return $order . $column; + } elseif ($action == 'check') { + return (!empty($this->_sortby[$column]) or + ($GLOBALS['request']->getArg('sortby') and + strstr($GLOBALS['request']->getArg('sortby'),$column))); + } elseif ($action == 'db') { + // native sort possible? + $sortable_columns = $this->sortable_columns(); + if (in_array($column, $sortable_columns)) + // asc or desc: +pagename, -pagename + return $column . ($order == '+' ? ' ASC' : ' DESC'); + else + return ''; + } + return ''; + } + + function sortable_columns() { + return array('pagename'/*,'mtime','author_id','author'*/); + } + }; @@ -451,5 +521,6 @@ class WikiDB_backend * multiple records. * - * FIXME: this should be two seperate classes: page_iter and version_iter. + * FIXME: This might be two seperate classes: page_iter and version_iter. + * For the versions we have WikiDB_backend_dumb_AllRevisionsIter. */ class WikiDB_backend_iterator @@ -458,5 +529,5 @@ class WikiDB_backend_iterator * Get the next record in the iterator set. * - * This returns a hash. The has may contain the following keys: + * This returns a hash. The hash may contain the following keys: * <dl> * <dt> pagename <dt> (string) the page name |