/** * Populate forum id arrays. * @throws \coding_exception */ protected function populate_forums() { local::swap_global_user($this->user->id); // Note - we don't include the site in the list of courses. This is intentional - we want student engagement to // be increased in courses where learning takes place and the front page is unlikely to fit that model. // Currently we are using local::swap_global_user as a hack for the following function (MDL-51353). $this->courses = enrol_get_my_courses(); $forums = []; $hsuforums = []; foreach ($this->courses as $course) { $forums = $forums + forum_get_readable_forums($this->user->id, $course->id); if (function_exists('hsuforum_get_readable_forums')) { $hsuforums = $hsuforums + hsuforum_get_readable_forums($this->user->id, $course->id, true); } } // Remove Q&A forums from array. $forums = $this->purge_qa_forums($forums); $hsuforums = $this->purge_qa_forums($hsuforums); // Rmove forums in courses not accessed for a long time. $forums = $this->process_stale_forums($forums); $hsuforums = $this->process_stale_forums($hsuforums, true); $this->forums = $forums; $this->hsuforums = $hsuforums; $this->forumids = array_keys($forums); $this->forumidsallgroups = $this->forumids_accessallgroups($forums); $this->hsuforumids = array_keys($hsuforums); $this->hsuforumidsallgroups = $this->forumids_accessallgroups($hsuforums, 'hsuforum'); local::swap_global_user(false); }
/** * Returns a list of posts found using an array of search terms. * * @global object * @global object * @global object * @param array $searchterms array of search terms, e.g. word +word -word * @param int $courseid if 0, we search through the whole site * @param int $limitfrom * @param int $limitnum * @param int &$totalcount * @param string $extrasql * @return array|bool Array of posts found or false */ function hsuforum_search_posts($searchterms, $courseid = 0, $limitfrom = 0, $limitnum = 50, &$totalcount, $extrasql = '') { global $CFG, $DB, $USER; require_once $CFG->libdir . '/searchlib.php'; $forums = hsuforum_get_readable_forums($USER->id, $courseid); if (count($forums) == 0) { $totalcount = 0; return false; } $now = round(time(), -2); // db friendly $fullaccess = array(); $where = array(); $params = array('privatereply1' => $USER->id, 'privatereply2' => $USER->id); foreach ($forums as $forumid => $forum) { $select = array(); if (!$forum->viewhiddentimedposts) { $select[] = "(d.userid = :userid{$forumid} OR (d.timestart < :timestart{$forumid} AND (d.timeend = 0 OR d.timeend > :timeend{$forumid})))"; $params = array_merge($params, array('userid' . $forumid => $USER->id, 'timestart' . $forumid => $now, 'timeend' . $forumid => $now)); } if ($forum->type == 'qanda' && !has_capability('mod/hsuforum:viewqandawithoutposting', $forum->context)) { if (!empty($forum->onlydiscussions)) { list($discussionid_sql, $discussionid_params) = $DB->get_in_or_equal($forum->onlydiscussions, SQL_PARAMS_NAMED, 'qanda' . $forumid . '_'); $params = array_merge($params, $discussionid_params); $select[] = "(d.id {$discussionid_sql} OR p.parent = 0)"; } else { $select[] = "p.parent = 0"; } } if (!empty($forum->onlygroups)) { list($groupid_sql, $groupid_params) = $DB->get_in_or_equal($forum->onlygroups, SQL_PARAMS_NAMED, 'grps' . $forumid . '_'); $params = array_merge($params, $groupid_params); $select[] = "d.groupid {$groupid_sql}"; } if ($select) { $selects = implode(" AND ", $select); $where[] = "(d.forum = :forum{$forumid} AND {$selects})"; $params['forum' . $forumid] = $forumid; } else { $fullaccess[] = $forumid; } } if ($fullaccess) { list($fullid_sql, $fullid_params) = $DB->get_in_or_equal($fullaccess, SQL_PARAMS_NAMED, 'fula'); $params = array_merge($params, $fullid_params); $where[] = "(d.forum {$fullid_sql})"; } $selectdiscussion = "(" . implode(" OR ", $where) . ")"; $messagesearch = ''; $searchstring = ''; // Need to concat these back together for parser to work. foreach ($searchterms as $searchterm) { if ($searchstring != '') { $searchstring .= ' '; } $searchstring .= $searchterm; } // We need to allow quoted strings for the search. The quotes *should* be stripped // by the parser, but this should be examined carefully for security implications. $searchstring = str_replace("\\\"", "\"", $searchstring); $parser = new search_parser(); $lexer = new search_lexer($parser); if ($lexer->parse($searchstring)) { $parsearray = $parser->get_parsed_array(); // Experimental feature under 1.8! MDL-8830 // Use alternative text searches if defined // This feature only works under mysql until properly implemented for other DBs // Requires manual creation of text index for hsuforum_posts before enabling it: // CREATE FULLTEXT INDEX foru_post_tix ON [prefix]hsuforum_posts (subject, message) // Experimental feature under 1.8! MDL-8830 $usetextsearches = get_config('hsuforum', 'usetextsearches'); if (!empty($usetextsearches)) { list($messagesearch, $msparams) = search_generate_text_SQL($parsearray, 'p.message', 'p.subject', 'p.userid', 'u.id', 'u.firstname', 'u.lastname', 'p.modified', 'd.forum'); } else { list($messagesearch, $msparams) = search_generate_SQL($parsearray, 'p.message', 'p.subject', 'p.userid', 'u.id', 'u.firstname', 'u.lastname', 'p.modified', 'd.forum'); } $params = array_merge($params, $msparams); } $fromsql = "{hsuforum_posts} p,\n {hsuforum_discussions} d JOIN {hsuforum} f ON f.id = d.forum,\n {user} u"; foreach ($parsearray as $item) { if ($item->getType() == TOKEN_USER || $item->getType() == TOKEN_USERID) { // Additional user SQL for anonymous posts. $extrasql .= " AND ((f.anonymous != 1 OR p.userid = :currentuserid) OR p.reveal = 1) "; $params['currentuserid'] = $USER->id; break; } } $selectsql = "(p.privatereply = 0\n OR p.privatereply = :privatereply1\n OR p.userid = :privatereply2\n )\n AND {$messagesearch}\n AND p.discussion = d.id\n AND p.userid = u.id\n AND {$selectdiscussion}\n {$extrasql}"; $countsql = "SELECT COUNT(*)\n FROM {$fromsql}\n WHERE {$selectsql}"; $allnames = get_all_user_name_fields(true, 'u'); $searchsql = "SELECT p.*,\n d.forum,\n {$allnames},\n u.email,\n u.picture,\n u.imagealt,\n u.email\n FROM {$fromsql}\n WHERE {$selectsql}\n ORDER BY p.modified DESC"; $totalcount = $DB->count_records_sql($countsql, $params); return $DB->get_records_sql($searchsql, $params, $limitfrom, $limitnum); }