diff --git a/search/documents/wiki_document.php b/search/documents/wiki_document.php index 24ed20d173b..95820d1ca4d 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 9590695f9f6..3f6cfc029b6 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