From: mchampan Date: Fri, 14 Jul 2006 13:58:46 +0000 (+0000) Subject: Fixed pagination in query page (lines were too long, distorting table), X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=91ad9557c1e8b2010a26c38d7eb31b2fbc2a687c;p=moodle.git Fixed pagination in query page (lines were too long, distorting table), and added results caching to improve query time when browsing pages of the same query. Wiki document strips (x.x.x.x) ip field from author field now. --- diff --git a/search/documents/wiki_document.php b/search/documents/wiki_document.php index 24ed20d173..95820d1ca4 100644 --- a/search/documents/wiki_document.php +++ b/search/documents/wiki_document.php @@ -21,7 +21,9 @@ // generic information; required $doc->id = $page->id; $doc->title = $page->pagename; - $doc->author = $page->author; + + //remove '(ip.ip.ip.ip)' from wiki author field + $doc->author = preg_replace('/\(.*?\)/', '', $page->author); $doc->contents = $page->content; $doc->url = wiki_make_link($wiki_id, $page->pagename, $page->version); diff --git a/search/query.php b/search/query.php index 9590695f9f..3f6cfc029b 100644 --- a/search/query.php +++ b/search/query.php @@ -23,7 +23,7 @@ * */ require_once('../config.php'); - require_once("$CFG->dirroot/search/lib.php"); + require_once("$CFG->dirroot/search/lib.php"); //check for php5, but don't die yet (see line 27) if ($check = search_check_php5()) { @@ -46,7 +46,91 @@ //print $e; $no_index = true; } //catch - } //if + } //if + + + //Result document class that contains all the display information we need + class ResultDocument { + public $url, + $title, + $score, + $doctype, + $author; + } //ResultDocument + + //generates an HTML string of links to result pages + function page_numbers($query, $hits, $page=1, $results_per_page=20) { + //total result pages + $pages = ceil($hits/$results_per_page); + + $ret = "
"; + + //Back is disabled if we're on page 1 + if ($page > 1) { + $ret .= "< Back "; + } else { + $ret .= "< Back "; + } //else + + //don't the current page + for ($i = 1; $i <= $pages; $i++) { + if ($page == $i) { + $ret .= "[$i] "; + } else { + $ret .= "$i "; + } //else + } //for + + //Next disabled if we're on the last page + if ($page < $pages) { + $ret .= "Next > "; + } else { + $ret .= "Next > "; + } //else + + $ret .= "
"; + + //shorten really long page lists, to stop table distorting width-ways + if (strlen($ret) > 70) { + $start = 4; + $end = $page - 5; + $ret = preg_replace("/$start<\/a>.*?$end<\/a>/", '...', $ret); + + $start = $page + 5; + $end = $pages - 3; + $ret = preg_replace("/$start<\/a>.*?$end<\/a>/", '...', $ret); + } //if + + return $ret; + } //page_numbers + + //calculates whether a user is allowed to see this result + function can_display(&$user, $course_id, $group_id) { + return true; + } //can_display + + //caches the results of the last query, deletes the previous one also + function cache($id=false, &$object=false) { + //see if there was a previous query + $last_term = (isset($_SESSION['search_last_term'])) ? $_SESSION['search_last_term'] : false; + + //if this query is different from the last, clear out the last one + if ($id != false and $last_term != $id) { + unset($_SESSION[$last_term]); + session_unregister($last_term); + } //if + + //store the new query if id and object are passed in + if ($object and $id) { + $_SESSION['search_last_term'] = $id; + $_SESSION[$id] = $object; + return true; + //otherwise return the stored results + } else if ($id and isset($_SESSION[$id])) { + return $_SESSION[$id]; + } //else + } //cache + if (!$site = get_site()) { redirect("index.php"); @@ -82,19 +166,19 @@
count(); -} //else - -print ' documents.'; - -if ($no_index and isadmin()) { - print "

Admin: There appears to be no index, click here to create one."; -} //if + echo 'Searching: '; + + if ($no_index) { + print "0"; + } else { + print $index->count(); + } //else + + print ' documents.'; + + if ($no_index and isadmin()) { + print "

Admin: There appears to be no index, click here to create one."; + } //if ?>
@@ -105,15 +189,46 @@ if ($no_index and isadmin()) { print_simple_box_start('center', '50%', 'white', 10); search_stopwatch(); - $hits = $index->find(strtolower($query_string)); - $hit_count = count($hits); + + //if the cache is empty + if (!($hits = cache($query_string))) { + $resultdocs = array(); + $resultdoc = new ResultDocument; + + //generate a new result-set + $hits = $index->find(strtolower($query_string)); + + foreach ($hits as $hit) { + //check permissions on each result + if (can_display($USER, $hit->course_id, $hit->group_id)) { + $resultdoc->url = $hit->url; + $resultdoc->title = $hit->title; + $resultdoc->score = $hit->score; + $resultdoc->doctype = $hit->doctype; + $resultdoc->author = $hit->author; + + //and store it if it passes the test + $resultdocs[] = clone($resultdoc); + } //if + } //foreach + + //cache the results so we don't have to compute this on every page-load + cache($query_string, $resultdocs); + + //print "Using new results."; + } else { + //There was something in the cache, so we're using that to save time + //print "Using cached results."; + } //else + + $hit_count = count($hits); print "
"; print $hit_count." results returned for '".stripslashes($query_string)."'."; print "
"; - if ($hit_count > 0) { + if ($hit_count > 0) { if ($hit_count < $results_per_page) { $page_number = 1; } else if ($page_number > ceil($hit_count/$results_per_page)) { @@ -122,6 +237,8 @@ if ($no_index and isadmin()) { $start = ($page_number - 1)*$results_per_page; $end = $start + $results_per_page; + + $page_links = page_numbers($query_string, $hit_count, $page_number, $results_per_page); print "
    "; @@ -131,7 +248,7 @@ if ($no_index and isadmin()) { } //if $listing = $hits[$i]; - + print "
  1. $listing->title
    \n" ."".search_shorten_url($listing->url, 70)."
    \n" ."Type: ".$listing->doctype.", score: ".round($listing->score, 3).", author: ".$listing->author."
    \n" @@ -139,31 +256,8 @@ if ($no_index and isadmin()) { } //for print "
"; - } //if - - print "
"; - - if ($page_number > 1) { - print "< Back "; - } else { - print "< Back "; - } //else - - for ($i = 1; $i <= ceil($hit_count/$results_per_page); $i++) { - if ($page_number == $i) { - print "[$i] "; - } else { - print "$i "; - } //else - } //for - - if ($page_number < ceil($hit_count/$results_per_page)) { - print "Next > "; - } else { - print "Next > "; - } //else - - print "
"; + print $page_links; + } //if print_simple_box_end(); } //if