| 1 | efrain | 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/>.
 | 
        
           |  |  | 16 |   | 
        
           |  |  | 17 | /**
 | 
        
           |  |  | 18 |  * Search area for Moodle courses.
 | 
        
           |  |  | 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;
 | 
        
           |  |  | 25 |   | 
        
           |  |  | 26 | defined('MOODLE_INTERNAL') || die();
 | 
        
           |  |  | 27 |   | 
        
           |  |  | 28 | /**
 | 
        
           |  |  | 29 |  * Search area for Moodle courses.
 | 
        
           |  |  | 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 course extends \core_search\base {
 | 
        
           |  |  | 36 |   | 
        
           |  |  | 37 |     /**
 | 
        
           |  |  | 38 |      * The context levels the search implementation is working on.
 | 
        
           |  |  | 39 |      *
 | 
        
           |  |  | 40 |      * @var array
 | 
        
           |  |  | 41 |      */
 | 
        
           |  |  | 42 |     protected static $levels = [CONTEXT_COURSE];
 | 
        
           |  |  | 43 |   | 
        
           |  |  | 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 |      */
 | 
        
           | 1441 | ariadna | 51 |     public function get_document_recordset($modifiedfrom = 0, ?\context $context = null) {
 | 
        
           | 1 | efrain | 52 |         global $DB;
 | 
        
           |  |  | 53 |   | 
        
           |  |  | 54 |         list ($contextjoin, $contextparams) = $this->get_course_level_context_restriction_sql(
 | 
        
           |  |  | 55 |                 $context, 'c');
 | 
        
           |  |  | 56 |         if ($contextjoin === null) {
 | 
        
           |  |  | 57 |             return null;
 | 
        
           |  |  | 58 |         }
 | 
        
           |  |  | 59 |   | 
        
           |  |  | 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 |     }
 | 
        
           |  |  | 67 |   | 
        
           |  |  | 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);
 | 
        
           |  |  | 93 |   | 
        
           |  |  | 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 |         }
 | 
        
           |  |  | 99 |   | 
        
           |  |  | 100 |         return $doc;
 | 
        
           |  |  | 101 |     }
 | 
        
           |  |  | 102 |   | 
        
           |  |  | 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 |   | 
        
           |  |  | 116 |         if (\core_course_category::can_view_course_info($course)) {
 | 
        
           |  |  | 117 |             return \core_search\manager::ACCESS_GRANTED;
 | 
        
           |  |  | 118 |         }
 | 
        
           |  |  | 119 |   | 
        
           |  |  | 120 |         return \core_search\manager::ACCESS_DENIED;
 | 
        
           |  |  | 121 |     }
 | 
        
           |  |  | 122 |   | 
        
           |  |  | 123 |     /**
 | 
        
           |  |  | 124 |      * Link to the course.
 | 
        
           |  |  | 125 |      *
 | 
        
           |  |  | 126 |      * @param \core_search\document $doc
 | 
        
           |  |  | 127 |      * @return \moodle_url
 | 
        
           |  |  | 128 |      */
 | 
        
           |  |  | 129 |     public function get_doc_url(\core_search\document $doc) {
 | 
        
           |  |  | 130 |         return $this->get_context_url($doc);
 | 
        
           |  |  | 131 |     }
 | 
        
           |  |  | 132 |   | 
        
           |  |  | 133 |     /**
 | 
        
           |  |  | 134 |      * Link to the course.
 | 
        
           |  |  | 135 |      *
 | 
        
           |  |  | 136 |      * @param \core_search\document $doc
 | 
        
           |  |  | 137 |      * @return \moodle_url
 | 
        
           |  |  | 138 |      */
 | 
        
           |  |  | 139 |     public function get_context_url(\core_search\document $doc) {
 | 
        
           |  |  | 140 |         return new \moodle_url('/course/view.php', array('id' => $doc->get('courseid')));
 | 
        
           |  |  | 141 |     }
 | 
        
           |  |  | 142 |   | 
        
           |  |  | 143 |     /**
 | 
        
           |  |  | 144 |      * Returns true if this area uses file indexing.
 | 
        
           |  |  | 145 |      *
 | 
        
           |  |  | 146 |      * @return bool
 | 
        
           |  |  | 147 |      */
 | 
        
           |  |  | 148 |     public function uses_file_indexing() {
 | 
        
           |  |  | 149 |         return true;
 | 
        
           |  |  | 150 |     }
 | 
        
           |  |  | 151 |   | 
        
           |  |  | 152 |     /**
 | 
        
           |  |  | 153 |      * Return the context info required to index files for
 | 
        
           |  |  | 154 |      * this search area.
 | 
        
           |  |  | 155 |      *
 | 
        
           |  |  | 156 |      * Should be overridden by each search area.
 | 
        
           |  |  | 157 |      *
 | 
        
           |  |  | 158 |      * @return array
 | 
        
           |  |  | 159 |      */
 | 
        
           |  |  | 160 |     public function get_search_fileareas() {
 | 
        
           |  |  | 161 |         $fileareas = array(
 | 
        
           |  |  | 162 |                 'overviewfiles',
 | 
        
           |  |  | 163 |                 'summary'// Fileareas.
 | 
        
           |  |  | 164 |         );
 | 
        
           |  |  | 165 |   | 
        
           |  |  | 166 |         return $fileareas;
 | 
        
           |  |  | 167 |     }
 | 
        
           |  |  | 168 |   | 
        
           |  |  | 169 |     /**
 | 
        
           |  |  | 170 |      * Returns the moodle component name.
 | 
        
           |  |  | 171 |      *
 | 
        
           |  |  | 172 |      * It might be the plugin name (whole frankenstyle name) or the core subsystem name.
 | 
        
           |  |  | 173 |      *
 | 
        
           |  |  | 174 |      * @return string
 | 
        
           |  |  | 175 |      */
 | 
        
           |  |  | 176 |     public function get_component_name() {
 | 
        
           |  |  | 177 |         return 'course';
 | 
        
           |  |  | 178 |     }
 | 
        
           |  |  | 179 |   | 
        
           |  |  | 180 |     /**
 | 
        
           |  |  | 181 |      * Returns an icon instance for the document.
 | 
        
           |  |  | 182 |      *
 | 
        
           |  |  | 183 |      * @param \core_search\document $doc
 | 
        
           |  |  | 184 |      * @return \core_search\document_icon
 | 
        
           |  |  | 185 |      */
 | 
        
           |  |  | 186 |     public function get_doc_icon(\core_search\document $doc): \core_search\document_icon {
 | 
        
           |  |  | 187 |         return new \core_search\document_icon('i/course');
 | 
        
           |  |  | 188 |     }
 | 
        
           |  |  | 189 |   | 
        
           |  |  | 190 |     /**
 | 
        
           |  |  | 191 |      * Returns a list of category names associated with the area.
 | 
        
           |  |  | 192 |      *
 | 
        
           |  |  | 193 |      * @return array
 | 
        
           |  |  | 194 |      */
 | 
        
           |  |  | 195 |     public function get_category_names() {
 | 
        
           |  |  | 196 |         return [\core_search\manager::SEARCH_AREA_CATEGORY_COURSES];
 | 
        
           |  |  | 197 |     }
 | 
        
           |  |  | 198 | }
 |