Advanced search page added.

This commit is contained in:
mchampan 2006-08-14 02:29:43 +00:00
parent a7c3953d1c
commit 6e7805628e
4 changed files with 177 additions and 17 deletions

View File

@ -1,3 +1,30 @@
2006/08/14
----------
First revision of the advanced search page completed. Functional,
but needs a date search field still.
2006/08/02
----------
Added resource search type, and the ability to specify custom 'virtual'
models to search - allowing for non-module specific information to be
indexed. Specify the extra search types to use in lib.php.
2006/07/28
----------
Added delete logic to documents; the moodle database log is checked
and any found delete events are used to remove the referenced documents
from the database table and search index.
Added database table name constant to lib.php, must change files using
the static table name.
Changed documents to use 'docid' instead of 'id' to reference the moodle
instance id, since Zend Search adds it's own internal 'id' field. Noticed
this whilst working on deletions.
Added some additional fields to the permissions checking method, must still
implement it though.
2006/07/25
----------
Query logic moved into the SearchQuery class in querylib.php. Should be able

View File

@ -11,7 +11,7 @@
define('SEARCH_DATABASE_TABLE', 'search_documents');
//document types that can be searched
define('SEARCH_TYPE_NONE', 'none');
//define('SEARCH_TYPE_NONE', 'none');
define('SEARCH_TYPE_WIKI', 'wiki');
define('SEARCH_TYPE_FORUM', 'forum');
define('SEARCH_TYPE_GLOSSARY', 'glossary');
@ -27,6 +27,8 @@
} //if
} //foreach
sort($ret);
return $ret;
} //search_get_document_types

View File

@ -29,7 +29,60 @@
if ($check = search_check_php5()) {
require_once("$CFG->dirroot/search/querylib.php");
$advanced = (optional_param('a', '0', PARAM_INT) == '1') ? true : false;
$pages = (optional_param('p', '0', PARAM_INT) == '1') ? true : false;
$query_string = optional_param('query_string', '', PARAM_CLEAN);
if ($pages && isset($_SESSION['search_advanced_query'])) {
$adv = unserialize($_SESSION['search_advanced_query']);
} else if ($advanced) {
unset($_SESSION['search_advanced_query']);
session_unregister('search_advanced_query');
$adv->mustappear = trim(optional_param('mustappear', '', PARAM_CLEAN), $chars);
$adv->notappear = trim(optional_param('notappear', '', PARAM_CLEAN), $chars);
$adv->canappear = trim(optional_param('canappear', '', PARAM_CLEAN), $chars);
$adv->module = optional_param('module', '', PARAM_CLEAN);
$adv->title = trim(optional_param('title', '', PARAM_CLEAN), $chars);
$adv->author = trim(optional_param('author', '', PARAM_CLEAN), $chars);
} //else
if ($advanced) {
$chars = ' \t\n\r\0\x0B,;';
$query_string = '';
$module_types = array_merge(array('All'), array_values(search_get_document_types()));
$adv->module = in_array($adv->module, $module_types) ? $adv->module : 'All';
if (strlen(trim($adv->mustappear)) > 0) {
$query_string = ' +'.implode(' +', preg_split("/[\s,;]+/", $adv->mustappear));
} //if
if (strlen(trim($adv->notappear)) > 0) {
$query_string .= ' -'.implode(' -', preg_split("/[\s,;]+/", $adv->notappear));
} //if
if (strlen(trim($adv->canappear)) > 0) {
$query_string .= ' '.implode(' ', preg_split("/[\s,;]+/", $adv->canappear));
} //if
if ($adv->module != 'All') {
$query_string .= ' +doctype:'.$adv->module;
} //if
if (strlen(trim($adv->title)) > 0) {
$query_string .= ' +title:'.implode(' +title:', preg_split("/[\s,;]+/", $adv->title));
} //if
if (strlen(trim($adv->author)) > 0) {
$query_string .= ' +author:'.implode(' +author:', preg_split("/[\s,;]+/", $adv->author));
} //if
if (!empty($query_string)) {
$_SESSION['search_advanced_query'] = serialize($adv);
} //if
} //if
$page_number = optional_param('page', 1, PARAM_INT);
if ($page_number < 1) {
@ -61,18 +114,93 @@
print_simple_box_start('center', '', '', 20);
$vars = get_object_vars($adv);
foreach ($vars as $key => $value) {
$adv->$key = stripslashes(htmlentities($value));
} //foreach
?>
<form name="query" method="get" action="query.php">
<?php if (!$advanced) { ?>
<input type="text" name="query_string" length="50" value="<?php print stripslashes(htmlentities($query_string)) ?>"/>
&nbsp;<input type="submit" value="Search"/>&nbsp;&nbsp;<a href="query.php?advanced=yes">Advanced search</a>
&nbsp;<input type="submit" value="Search"/>&nbsp;&nbsp;
<a href="query.php?a=1">Advanced search</a>
<a href="stats.php">Statistics</a>
<?php } else {
print_simple_box_start('center', '', 'white', 10);
?>
<input type="hidden" name="a" value="<?php print $advanced; ?>"/>
<table border="0" cellpadding="3" cellspacing="3">
<tr>
<td width="240">These words must appear:</td>
<td><input type="text" name="mustappear" length="50" value="<?php print $adv->mustappear; ?>"/></td>
</tr>
<tr>
<td>These words must not appear:</td>
<td><input type="text" name="notappear" length="50" value="<?php print $adv->notappear; ?>"/></td>
</tr>
<tr>
<td>These words help improve rank:</td>
<td><input type="text" name="canappear" length="50" value="<?php print $adv->canappear; ?>"/></td>
</tr>
<tr>
<td>Which modules to search?:</td>
<td>
<select name="module">
<?php foreach($module_types as $mod) {
if ($mod == $adv->module) {
print "<option value='$mod' selected>$mod</option>\n";
} else {
print "<option value='$mod'>$mod</option>\n";
} //else
} ?>
</select>
</td>
</tr>
<tr>
<td>Words in title:</td>
<td><input type="text" name="title" length="50" value="<?php print $adv->title; ?>"/></td>
</tr>
<tr>
<td>Author name:</td>
<td><input type="text" name="author" length="50" value="<?php print $adv->author; ?>"/></td>
</tr>
<tr>
<td colspan="3" align="center"><br><input type="submit" value="Search"/></td>
</tr>
<tr>
<td colspan="3" align="center">
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td><a href="query.php">Normal search</a>&nbsp;</td>
<td>&nbsp;<a href="stats.php">Statistics</a></td>
</tr>
</table>
</td>
</tr>
</table>
<?php
print_simple_box_end();
} //if
?>
</form>
<br>
<div align="center">
<?php
print '<div align="center">';
print 'Searching: ';
if ($sq->is_valid_index()) {
@ -86,10 +214,9 @@
if (!$sq->is_valid_index() and isadmin()) {
print "<br><br>Admin: There appears to be no index, click <a href='indexersplash.php'>here</a> to create one.";
} //if
?>
</div>
<?php
print '</div>';
print_simple_box_end();
if ($sq->is_valid()) {
@ -107,6 +234,10 @@
$page_links = $sq->page_numbers();
$hits = $sq->results();
if ($advanced) {
$page_links = preg_replace("/query_string=[^&]+/", 'a=1&p=1', $page_links);
} //if
print "<ol>";
foreach ($hits as $listing) {

View File

@ -170,7 +170,7 @@
foreach ($hits as $hit) {
//check permissions on each result
if ($this->can_display($USER, $hit->course_id, $hit->group_id)) {
if ($this->can_display($USER, $hit->id, $hit->doctype, $hit->course_id, $hit->group_id)) {
$resultdoc->number = $i;
$resultdoc->url = $hit->url;
$resultdoc->title = $hit->title;
@ -212,7 +212,7 @@
public function page_numbers() {
$pages = $this->total_pages();
$query = $this->term;
$query = htmlentities($this->term);
$page = $this->pagenumber;
$next = "Next";
$back = "Back";
@ -259,7 +259,7 @@
} //page_numbers
//can the user see this result?
private function can_display($user, $course_id, $group_id) {
private function can_display(&$user, $this_id, $doctype, $course_id, $group_id) {
//this function should return true/false depending on
//whether or not a user can see this resource
//..