9cbdc58e67967251b13966a673c86242a591077c
[moodle.git] / course / classes / search / mycourse.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Search area for Moodle courses I can access.
19  *
20  * @package    core_course
21  * @copyright  2016 Skylar Kelty <S.Kelty@kent.ac.uk>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 namespace core_course\search;
26 defined('MOODLE_INTERNAL') || die();
28 /**
29  * Search area for Moodle courses I can access.
30  *
31  * @package    core_course
32  * @copyright  2016 Skylar Kelty <S.Kelty@kent.ac.uk>
33  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class mycourse extends \core_search\base {
37     /**
38      * The context levels the search implementation is working on.
39      *
40      * @var array
41      */
42     protected static $levels = [CONTEXT_COURSE];
44     /**
45      * Returns recordset containing required data for indexing courses.
46      *
47      * @param int $modifiedfrom timestamp
48      * @param \context|null $context Restriction context
49      * @return \moodle_recordset|null Recordset or null if no change possible
50      */
51     public function get_document_recordset($modifiedfrom = 0, \context $context = null) {
52         global $DB;
54         list ($contextjoin, $contextparams) = $this->get_course_level_context_restriction_sql(
55                 $context, 'c');
56         if ($contextjoin === null) {
57             return null;
58         }
60         return $DB->get_recordset_sql("
61                 SELECT c.*
62                   FROM {course} c
63           $contextjoin
64                  WHERE c.timemodified >= ?
65               ORDER BY c.timemodified ASC", array_merge($contextparams, [$modifiedfrom]));
66     }
68     /**
69      * Returns the document associated with this course.
70      *
71      * @param stdClass $record
72      * @param array    $options
73      * @return \core_search\document
74      */
75     public function get_document($record, $options = array()) {
76         try {
77             $context = \context_course::instance($record->id);
78         } catch (\moodle_exception $ex) {
79             // Notify it as we run here as admin, we should see everything.
80             debugging('Error retrieving ' . $this->areaid . ' ' . $record->id . ' document, not all required data is available: ' .
81                 $ex->getMessage(), DEBUG_DEVELOPER);
82             return false;
83         }
84         // Prepare associative array with data from DB.
85         $doc = \core_search\document_factory::instance($record->id, $this->componentname, $this->areaname);
86         $doc->set('title', content_to_text($record->fullname, false));
87         $doc->set('content', content_to_text($record->summary, $record->summaryformat));
88         $doc->set('contextid', $context->id);
89         $doc->set('courseid', $record->id);
90         $doc->set('owneruserid', \core_search\manager::NO_OWNER_ID);
91         $doc->set('modified', $record->timemodified);
92         $doc->set('description1', $record->shortname);
94         // Check if this document should be considered new.
95         if (isset($options['lastindexedtime']) && $options['lastindexedtime'] < $record->timecreated) {
96             // If the document was created after the last index time, it must be new.
97             $doc->set_is_new(true);
98         }
100         return $doc;
101     }
103     /**
104      * Whether the user can access the document or not.
105      *
106      * @param int $id The course instance id.
107      * @return int
108      */
109     public function check_access($id) {
110         global $DB;
111         $course = $DB->get_record('course', array('id' => $id));
112         if (!$course) {
113             return \core_search\manager::ACCESS_DELETED;
114         }
115         if (can_access_course($course)) {
116             return \core_search\manager::ACCESS_GRANTED;
117         }
118         return \core_search\manager::ACCESS_DENIED;
119     }
121     /**
122      * Link to the course.
123      *
124      * @param \core_search\document $doc
125      * @return \moodle_url
126      */
127     public function get_doc_url(\core_search\document $doc) {
128         return $this->get_context_url($doc);
129     }
131     /**
132      * Link to the course.
133      *
134      * @param \core_search\document $doc
135      * @return \moodle_url
136      */
137     public function get_context_url(\core_search\document $doc) {
138         return new \moodle_url('/course/view.php', array('id' => $doc->get('courseid')));
139     }
141     /**
142      * Returns true if this area uses file indexing.
143      *
144      * @return bool
145      */
146     public function uses_file_indexing() {
147         return true;
148     }
150     /**
151      * Return the context info required to index files for
152      * this search area.
153      *
154      * Should be overridden by each search area.
155      *
156      * @return array
157      */
158     public function get_search_fileareas() {
159         $fileareas = array(
160                 'overviewfiles',
161                 'summary'// Fileareas.
162         );
164         return $fileareas;
165     }
167     /**
168      * Returns the moodle component name.
169      *
170      * It might be the plugin name (whole frankenstyle name) or the core subsystem name.
171      *
172      * @return string
173      */
174     public function get_component_name() {
175         return 'course';
176     }
178     /**
179      * Returns an icon instance for the document.
180      *
181      * @param \core_search\document $doc
182      * @return \core_search\document_icon
183      */
184     public function get_doc_icon(\core_search\document $doc) : \core_search\document_icon {
185         return new \core_search\document_icon('i/course');
186     }