Example #1
0
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 . '&amp;userid=' . $wiki_entry->userid . '&amp;groupid=' . $wiki_entry->groupid . '&amp;page=' . $wiki_page->pagename . '">';
                                $wikipagelist[] = new filterobject($wiki_page->pagename, $startlink, '</a>', false, true);
                                $wikientries[] = $wiki_page->pagename;
                            }
                        }
                    }
                }
            }
        }
    }
    return filter_phrases($text, $wikipagelist);
}
Example #2
0
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;
}