function wiki_filter($courseid, $text) { global $CFG, $DB; // Trivial-cache - keyed on $cachedcourseid static $nothingtodo; static $wikipagelist; static $cachedcourseid; if (empty($courseid)) { $courseid = SITEID; } // Initialise/invalidate our trivial cache if dealing with a different course if (!isset($cachedcourseid) || $cachedcourseid !== (int) $courseid) { $wikipagelist = array(); $nothingtodo = false; } $cachedcourseid = (int) $courseid; if (!empty($nothingtodo)) { // We've been here in this page already return $text; } /// Create a list of all the wikis to search for. It may be cached already. if (empty($wikipagelist)) { /// Get all wikis for this course. if (!($wikis = wiki_get_course_wikis($courseid))) { $nothingtodo = true; return $text; } $wikipagelist = array(); /// Walk through each wiki, and get entries. foreach ($wikis as $wiki) { if ($wiki_entries = wiki_get_entries($wiki)) { /// Walk through each entry and get the pages. foreach ($wiki_entries as $wiki_entry) { if ($wiki_pages = $DB->get_records('wiki_pages', array('wiki' => $wiki_entry->id), 'pagename, version DESC')) { /// Walk through each page and filter. $wikientries = array(); foreach ($wiki_pages as $wiki_page) { if (!in_array($wiki_page->pagename, $wikientries)) { $startlink = '<a class="wiki autolink" title="Wiki" href="' . $CFG->wwwroot . '/mod/wiki/view.php?wid=' . $wiki->id . '&userid=' . $wiki_entry->userid . '&groupid=' . $wiki_entry->groupid . '&page=' . $wiki_page->pagename . '">'; $wikipagelist[] = new filterobject($wiki_page->pagename, $startlink, '</a>', false, true); $wikientries[] = $wiki_page->pagename; } } } } } } } return filter_phrases($text, $wikipagelist); }
function wiki_get_other_wikis(&$wiki, &$user, &$course, $currentid = 0) { /// Returns a list of other wikis to display, depending on the type, group and user. /// Returns the key containing the currently selected entry as well. global $CFG, $id; $wikis = false; $groupmode = groups_get_activity_groupmode($wiki); $mygroupid = mygroupid($course->id); $isteacher = wiki_is_teacher($wiki, $user->id); $isteacheredit = wiki_is_teacheredit($wiki, $user->id); $groupingid = null; $cm = new stdClass(); $cm->id = $wiki->cmid; $cm->groupmode = $wiki->groupmode; $cm->groupingid = $wiki->groupingid; $cm->groupmembersonly = $wiki->groupmembersonly; if (!empty($CFG->enablegroupings) && !empty($cm->groupingid)) { $groupingid = $wiki->groupingid; } switch ($wiki->wtype) { case 'student': /// Get all the existing entries for this wiki. $wiki_entries = wiki_get_entries($wiki, 'student'); if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid)) { $sql = "SELECT gm.userid FROM {$CFG->prefix}groups_members gm " . "INNER JOIN {$CFG->prefix}groupings_groups gg ON gm.groupid = gg.groupid " . "WHERE gg.groupingid = {$wiki->groupingid} "; $groupingmembers = get_records_sql($sql); } if ($isteacher and SITEID != $course->id) { /// If the user is an editing teacher, or a non-editing teacher not assigned to a group, show all student /// wikis, regardless of creation. if (SITEID != $course->id and ($isteacheredit or $groupmode == NOGROUPS)) { if ($students = get_course_students($course->id)) { /// Default pagename is dependent on the wiki settings. $defpagename = empty($wiki->pagename) ? get_string('wikidefaultpagename', 'wiki') : $wiki->pagename; foreach ($students as $student) { if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid) && empty($groupingmembers[$student->id])) { continue; } /// If this student already has an entry, use its pagename. if ($wiki_entries[$student->id]) { $pagename = $wiki_entries[$student->id]->pagename; } else { $pagename = $defpagename; } $key = 'view.php?id=' . $id . '&userid=' . $student->id . '&page=' . $pagename; $wikis[$key] = fullname($student) . ':' . $pagename; } } } else { if ($groupmode == SEPARATEGROUPS) { if ($students = wiki_get_students($wiki, $mygroupid)) { $defpagename = empty($wiki->pagename) ? get_string('wikidefaultpagename', 'wiki') : $wiki->pagename; foreach ($students as $student) { if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid) && empty($groupingmembers[$student->id])) { continue; } /// If this student already has an entry, use its pagename. if ($wiki_entries[$student->id]) { $pagename = $wiki_entries[$student->id]->pagename; } else { $pagename = $defpagename; } $key = 'view.php?id=' . $id . '&userid=' . $student->id . '&page=' . $pagename; $wikis[$key] = fullname($student) . ':' . $pagename; } } } else { if ($groupmode == VISIBLEGROUPS) { /// Get all students in your group. if ($students = wiki_get_students($wiki, $mygroupid)) { $defpagename = empty($wiki->pagename) ? get_string('wikidefaultpagename', 'wiki') : $wiki->pagename; foreach ($students as $student) { if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid) && empty($groupingmembers[$student->id])) { continue; } /// If this student already has an entry, use its pagename. if ($wiki_entries[$student->id]) { $pagename = $wiki_entries[$student->id]->pagename; } else { $pagename = $defpagename; } $key = 'view.php?id=' . $id . '&userid=' . $student->id . '&page=' . $pagename; $wikis[$key] = fullname($student) . ':' . $pagename; } } /// Get all student wikis created, regardless of group. if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid)) { $sql = 'SELECT w.id, w.userid, w.pagename, u.firstname, u.lastname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w ' . ' INNER JOIN ' . $CFG->prefix . 'user u ON w.userid = u.id ' . ' INNER JOIN ' . $CFG->prefix . 'groups_members gm ON gm.userid = u.id ' . ' INNER JOIN ' . $CFG->prefix . 'groupings_groups gg ON gm.groupid = gg.groupid ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND gg.groupingid = ' . $wiki->groupingid . ' ORDER BY w.id'; } else { $sql = 'SELECT w.id, w.userid, w.pagename, u.firstname, u.lastname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w, ' . $CFG->prefix . 'user u ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND u.id = w.userid ' . ' ORDER BY w.id'; } $wiki_entries = get_records_sql($sql); $wiki_entries = is_array($wiki_entries) ? $wiki_entries : array(); foreach ($wiki_entries as $wiki_entry) { $key = 'view.php?id=' . $id . '&userid=' . $wiki_entry->userid . '&page=' . $wiki_entry->pagename; $wikis[$key] = fullname($wiki_entry) . ':' . $wiki_entry->pagename; if ($currentid == $wiki_entry->id) { $wikis['selected'] = $key; } } } } } } else { /// A user can see other student wikis if they are a member of the same /// group (for separate groups) or there are visible groups, or if this is /// a site-level wiki, and they are an administrator. if ($groupmode == VISIBLEGROUPS or wiki_is_teacheredit($wiki)) { $viewall = true; } else { if ($groupmode == SEPARATEGROUPS) { $viewall = mygroupid($course->id); } else { $viewall = false; } } if ($viewall !== false) { if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid)) { $sql = 'SELECT w.id, w.userid, w.pagename, u.firstname, u.lastname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w ' . ' INNER JOIN ' . $CFG->prefix . 'user u ON w.userid = u.id ' . ' INNER JOIN ' . $CFG->prefix . 'groups_members gm ON gm.userid = u.id ' . ' INNER JOIN ' . $CFG->prefix . 'groupings_groups gg ON gm.groupid = gg.groupid ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND gg.groupingid = ' . $wiki->groupingid . ' ORDER BY w.id'; } else { $sql = 'SELECT w.id, w.userid, w.pagename, u.firstname, u.lastname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w, ' . $CFG->prefix . 'user u ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND u.id = w.userid ' . ' ORDER BY w.id'; } $wiki_entries = get_records_sql($sql); $wiki_entries = is_array($wiki_entries) ? $wiki_entries : array(); foreach ($wiki_entries as $wiki_entry) { if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid) && empty($groupingmembers[$wiki_entry->userid])) { continue; } if ($viewall === true or groups_is_member($viewall, $wiki_entry->userid)) { $key = 'view.php?id=' . $id . '&userid=' . $wiki_entry->userid . '&page=' . $wiki_entry->pagename; $wikis[$key] = fullname($wiki_entry) . ':' . $wiki_entry->pagename; if ($currentid == $wiki_entry->id) { $wikis['selected'] = $key; } } } } } break; case 'group': /// If the user is an editing teacher, or a non-editing teacher not assigned to a group, show all group /// wikis, regardless of creation. /// If user is a member of multiple groups, need to show current group etc? /// Get all the existing entries for this wiki. $wiki_entries = wiki_get_entries($wiki, 'group'); if ($groupmode and ($isteacheredit or $isteacher and !$mygroupid)) { if ($groups = groups_get_all_groups($course->id, null, $groupingid)) { $defpagename = empty($wiki->pagename) ? get_string('wikidefaultpagename', 'wiki') : $wiki->pagename; foreach ($groups as $group) { /// If this group already has an entry, use its pagename. if (isset($wiki_entries[$group->id])) { $pagename = $wiki_entries[$group->id]->pagename; } else { $pagename = $defpagename; } $key = 'view.php?id=' . $id . ($group->id ? "&groupid=" . $group->id : "") . '&page=' . $pagename; $wikis[$key] = $group->name . ':' . $pagename; } } } else { if ($groupmode == SEPARATEGROUPS) { if ($groups = groups_get_all_groups($course->id, $user->id, $groupingid)) { $defpagename = empty($wiki->pagename) ? get_string('wikidefaultpagename', 'wiki') : $wiki->pagename; foreach ($groups as $group) { /// If this group already has an entry, use its pagename. if (isset($wiki_entries[$group->id])) { $pagename = $wiki_entries[$group->id]->pagename; } else { $pagename = $defpagename; } $key = 'view.php?id=' . $id . ($group->id ? "&groupid=" . $group->id : "") . '&page=' . $pagename; $wikis[$key] = $group->name . ':' . $pagename; } } } else { if ($groupmode == VISIBLEGROUPS) { if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid)) { $sql = 'SELECT w.id, w.groupid, w.pagename, g.name as gname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w ' . ' INNER JOIN ' . $CFG->prefix . 'groups g ON g.id = w.groupid ' . ' INNER JOIN ' . $CFG->prefix . 'groupings_groups gg ON g.id = gg.groupid ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND gg.groupingid = ' . $wiki->groupingid . ' ORDER BY w.groupid'; } else { $sql = 'SELECT w.id, w.groupid, w.pagename, g.name as gname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w, ' . $CFG->prefix . 'groups g ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND g.id = w.groupid ' . ' ORDER BY w.groupid'; } $wiki_entries = get_records_sql($sql); $wiki_entries = is_array($wiki_entries) ? $wiki_entries : array(); foreach ($wiki_entries as $wiki_entry) { $key = 'view.php?id=' . $id . ($wiki_entry->groupid ? "&groupid=" . $wiki_entry->groupid : "") . '&page=' . $wiki_entry->pagename; $wikis[$key] = $wiki_entry->gname . ':' . $wiki_entry->pagename; if ($currentid == $wiki_entry->id) { $wikis['selected'] = $key; } } } } } break; case 'teacher': if ($isteacher) { /// If the user is an editing teacher, or a non-editing teacher not assigned to a group, show all /// teacher wikis, regardless of creation. if ($groupmode and ($isteacheredit or $isteacher and !$mygroupid)) { if ($groups = groups_get_all_groups($course->id, null, $groupingid)) { $defpagename = empty($wiki->pagename) ? get_string('wikidefaultpagename', 'wiki') : $wiki->pagename; foreach ($groups as $group) { /// If this group already has an entry, use its pagename. if ($wiki_entries[$group->id]) { $pagename = $wiki_entries[$group->id]->pagename; } else { $pagename = $defpagename; } $key = 'view.php?id=' . $id . ($group->id ? "&groupid=" . $group->id : "") . '&page=' . $pagename; $wikis[$key] = $group->name . ':' . $pagename; } } } else { if ($groupmode) { if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid)) { $sql = 'SELECT w.id, w.groupid, w.pagename, g.name as gname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w ' . ' INNER JOIN ' . $CFG->prefix . 'groups g ON g.id = w.groupid ' . ' INNER JOIN ' . $CFG->prefix . 'groupings_groups gg ON g.id = gg.groupid ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND gg.groupingid = ' . $wiki->groupingid . ' ORDER BY w.groupid'; } else { $sql = 'SELECT w.id, w.groupid, w.pagename, g.name as gname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w, ' . $CFG->prefix . 'groups g ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND g.id = w.groupid ' . ' ORDER BY w.groupid'; } $wiki_entries = get_records_sql($sql); $wiki_entries = is_array($wiki_entries) ? $wiki_entries : array(); foreach ($wiki_entries as $wiki_entry) { $key = 'view.php?id=' . $id . ($wiki_entry->groupid ? "&groupid=" . $wiki_entry->groupid : "") . '&page=' . $wiki_entry->pagename; $wikis[$key] = $wiki_entry->gname . ':' . $wiki_entry->pagename; if ($currentid == $wiki_entry->id) { $wikis['selected'] = $key; } } } } } else { /// A user can see other teacher wikis if they are a teacher, a member of the same /// group (for separate groups) or there are visible groups. if ($groupmode == VISIBLEGROUPS) { $viewall = true; } else { if ($groupmode == SEPARATEGROUPS) { $viewall = $mygroupid; } else { $viewall = false; } } if ($viewall !== false) { if (!empty($CFG->enablegroupings) && !empty($wiki->groupingid)) { $sql = 'SELECT w.id, w.groupid, w.pagename, g.name as gname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w ' . ' INNER JOIN ' . $CFG->prefix . 'groups g ON g.id = w.groupid ' . ' INNER JOIN ' . $CFG->prefix . 'groupings_groups gg ON g.id = gg.groupid ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND gg.groupingid = ' . $wiki->groupingid . ' ORDER BY w.groupid'; } else { $sql = 'SELECT w.id, w.groupid, w.pagename, g.name as gname ' . ' FROM ' . $CFG->prefix . 'wiki_entries w, ' . $CFG->prefix . 'groups g ' . ' WHERE w.wikiid = ' . $wiki->id . ' AND g.id = w.groupid ' . ' ORDER BY w.groupid'; } $wiki_entries = get_records_sql($sql); $wiki_entries = is_array($wiki_entries) ? $wiki_entries : array(); foreach ($wiki_entries as $wiki_entry) { if ($viewall === true or @in_array($wiki_entry->groupid, $viewall)) { $key = 'view.php?id=' . $id . ($wiki_entry->groupid ? "&groupid=" . $wiki_entry->groupid : "") . '&page=' . $wiki_entry->pagename; $wikis[$key] = $wiki_entry->gname . ':' . $wiki_entry->pagename; if ($currentid == $wiki_entry->id) { $wikis['selected'] = $key; } } } } } break; } return $wikis; }
/** * part of search engine API * @param wiki a wiki instance * @return an array of searchable deocuments */ function wiki_get_content_for_index(&$wiki) { $documents = array(); $entries = wiki_get_entries($wiki); if ($entries) { $coursemodule = get_field('modules', 'id', 'name', 'wiki'); $cm = get_record('course_modules', 'course', $wiki->course, 'module', $coursemodule, 'instance', $wiki->id); $context = get_context_instance(CONTEXT_MODULE, $cm->id); foreach ($entries as $entry) { //all pages //$pages = wiki_get_pages($entry); //latest pages $pages = wiki_get_latest_pages($entry); if (is_array($pages)) { foreach ($pages as $page) { if (strlen($page->content) > 0) { $documents[] = new WikiSearchDocument(get_object_vars($page), $entry->wikiid, $entry->course, $entry->groupid, $page->userid, $context->id); } } } } } return $documents; }