c36d0504bdd63f76dde531422a95f6f9edf39dd1
[moodle.git] / course / search.php
1 <?php
3 /// Displays external information about a course
5     require_once("../config.php");
6     require_once("lib.php");
8     $search    = optional_param('search', '', PARAM_RAW);  // search words
9     $page      = optional_param('page', 0, PARAM_INT);     // which page to show
10     $perpage   = optional_param('perpage', 10, PARAM_INT); // how many per page
11     $moveto    = optional_param('moveto', 0, PARAM_INT);   // move to category
12     $edit      = optional_param('edit', -1, PARAM_BOOL);
13     $hide      = optional_param('hide', 0, PARAM_INT);
14     $show      = optional_param('show', 0, PARAM_INT);
15     $blocklist = optional_param('blocklist', 0, PARAM_INT);
16     $modulelist= optional_param('modulelist', '', PARAM_PLUGIN);
18     $PAGE->set_url('/course/search.php', compact('search', 'page', 'perpage', 'blocklist', 'modulelist', 'edit'));
19     $PAGE->set_context(get_context_instance(CONTEXT_SYSTEM));
20     $search = trim(strip_tags($search)); // trim & clean raw searched string
22     if ($search) {
23         $searchterms = explode(" ", $search);    // Search for words independently
24         foreach ($searchterms as $key => $searchterm) {
25             if (strlen($searchterm) < 2) {
26                 unset($searchterms[$key]);
27             }
28         }
29         $search = trim(implode(" ", $searchterms));
30     }
32     $site = get_site();
34     $urlparams = array();
35     foreach (array('search', 'page', 'blocklist', 'modulelist') as $param) {
36         if (!empty($$param)) {
37             $urlparams[$param] = $$param;
38         }
39     }
40     if ($perpage != 10) {
41         $urlparams['perpage'] = $perpage;
42     }
43     $PAGE->set_url('/course/search.php', $urlparams);
44     $PAGE->set_context(get_context_instance(CONTEXT_SYSTEM));
46     if ($CFG->forcelogin) {
47         require_login();
48     }
50     if (can_edit_in_category()) {
51         if ($edit !== -1) {
52             $USER->editing = $edit;
53         }
54         $adminediting = $PAGE->user_is_editing();
55     } else {
56         $adminediting = false;
57     }
59 /// Editing functions
60     if (has_capability('moodle/course:visibility', get_context_instance(CONTEXT_SYSTEM))) {
61     /// Hide or show a course
62         if ($hide or $show and confirm_sesskey()) {
63             if ($hide) {
64                 $course = $DB->get_record("course", array("id"=>$hide));
65                 $visible = 0;
66             } else {
67                 $course = $DB->get_record("course", array("id"=>$show));
68                 $visible = 1;
69             }
70             if ($course) {
71                 $DB->set_field("course", "visible", $visible, array("id"=>$course->id));
72             }
73         }
74     }
76     $capabilities = array('moodle/course:create', 'moodle/category:manage');
77     if (has_any_capability($capabilities, get_context_instance(CONTEXT_SYSTEM)) && ($perpage != 99999)) {
78         $perpage = 30;
79     }
81     $displaylist = array();
82     $parentlist = array();
83     make_categories_list($displaylist, $parentlist);
85     $strcourses = get_string("courses");
86     $strsearch = get_string("search");
87     $strsearchresults = get_string("searchresults");
88     $strcategory = get_string("category");
89     $strselect   = get_string("select");
90     $strselectall = get_string("selectall");
91     $strdeselectall = get_string("deselectall");
92     $stredit = get_string("edit");
93     $strfrontpage = get_string('frontpage', 'admin');
94     $strnovalidcourses = get_string('novalidcourses');
96     if (empty($search) and empty($blocklist) and empty($modulelist)) {
97         $PAGE->navbar->add($strcourses, new moodle_url('/course/index.php'));
98         $PAGE->navbar->add($strsearch);
99         $PAGE->set_title("$site->fullname : $strsearch");
100         $PAGE->set_heading($site->fullname);
102         echo $OUTPUT->header();
103         echo $OUTPUT->box_start();
104         echo "<center>";
105         echo "<br />";
106         print_course_search("", false, "plain");
107         echo "<br /><p>";
108         print_string("searchhelp");
109         echo "</p>";
110         echo "</center>";
111         echo $OUTPUT->box_end();
112         echo $OUTPUT->footer();
113         exit;
114     }
116     if (!empty($moveto) and $data = data_submitted() and confirm_sesskey()) {   // Some courses are being moved
117         if (! $destcategory = $DB->get_record("course_categories", array("id"=>$data->moveto))) {
118             print_error('cannotfindcategory', '', '', $data->moveto);
119         }
121         $courses = array();
122         foreach ( $data as $key => $value ) {
123             if (preg_match('/^c\d+$/', $key)) {
124                 array_push($courses, substr($key, 1));
125             }
126         }
127         move_courses($courses, $data->moveto);
128     }
130     // get list of courses containing blocks if required
131     if (!empty($blocklist) and confirm_sesskey()) {
132         $blockname = $DB->get_field('block', 'name', array('id' => $blocklist));
133         $courses = array();
134         $courses = $DB->get_records_sql("
135                 SELECT * FROM {course} WHERE id IN (
136                     SELECT DISTINCT ctx.instanceid
137                     FROM {context} ctx
138                     JOIN {block_instances} bi ON bi.parentcontextid = ctx.id
139                     WHERE ctx.contextlevel = " . CONTEXT_COURSE . " AND bi.blockname = ?)",
140                 array($blockname));
141         $totalcount = count($courses);
142         //Keep only chunk of array which you want to display
143         if ($totalcount > $perpage) {
144             $courses = array_chunk($courses, $perpage, true);
145             $courses = $courses[$page];
146         }
147         foreach ($courses as $course) {
148             $courses[$course->id] = $course;
149         }
150     }
151     // get list of courses containing modules if required
152     elseif (!empty($modulelist) and confirm_sesskey()) {
153         $modulename = $modulelist;
154         $sql =  "SELECT DISTINCT c.id FROM {".$modulelist."} module, {course} c"
155             ." WHERE module.course=c.id";
157         $courseids = $DB->get_records_sql($sql);
158         $courses = array();
159         if (!empty($courseids)) {
160             $firstcourse = $page*$perpage;
161             $lastcourse = $page*$perpage + $perpage -1;
162             $i = 0;
163             foreach ($courseids as $courseid) {
164                 if ($i>= $firstcourse && $i<=$lastcourse) {
165                     $courses[$courseid->id] = $DB->get_record('course', array('id'=> $courseid->id));
166                 }
167                 $i++;
168             }
169             $totalcount = count($courseids);
170         }
171         else {
172             $totalcount = 0;
173         }
174     }
175     else {
176         $courses = get_courses_search($searchterms, "fullname ASC",
177             $page, $perpage, $totalcount);
178     }
180     $searchform = print_course_search($search, true, "navbar");
182     if (!empty($courses) && has_capability('moodle/course:create', get_context_instance(CONTEXT_SYSTEM))) {
183         $searchform = '';
184         // not sure if this capability is the best  here
185         if (has_capability('moodle/category:manage', get_context_instance(CONTEXT_SYSTEM))) {
186             if ($PAGE->user_is_editing()) {
187                 $string = get_string("turneditingoff");
188                 $edit = "off";
189             } else {
190                 $string = get_string("turneditingon");
191                 $edit = "on";
192             }
194             $aurl = new moodle_url("$CFG->wwwroot/course/search.php", array(
195                     'edit' => $edit,
196                     'sesskey' => sesskey(),
197                     'search' => $search,
198                     'page' => $page,
199                     'perpage' => $perpage));
200             $searchform = $OUTPUT->single_button($aurl, $string, 'get');
201         }
202     }
204     $PAGE->navbar->add($strcourses, new moodle_url('/course/index.php'));
205     $PAGE->navbar->add($strsearch, new moodle_url('/course/search.php'));
206     if (!empty($search)) {
207         $PAGE->navbar->add(s($search));
208     }
209     $PAGE->set_title("$site->fullname : $strsearchresults");
210     $PAGE->set_heading($site->fullname);
211     $PAGE->set_button($searchform);
213     echo $OUTPUT->header();
215     $lastcategory = -1;
216     if ($courses) {
217         echo $OUTPUT->heading("$strsearchresults: $totalcount");
218         $encodedsearch = urlencode($search);
220         // add the module/block parameter to the paging bar if they exists
221         $modulelink = "";
222         if (!empty($modulelist) and confirm_sesskey()) {
223             $modulelink = "&amp;modulelist=".$modulelist."&amp;sesskey=".sesskey();
224         } else if (!empty($blocklist) and confirm_sesskey()) {
225             $modulelink = "&amp;blocklist=".$blocklist."&amp;sesskey=".sesskey();
226         }
228         print_navigation_bar($totalcount, $page, $perpage, $encodedsearch, $modulelink);
230         if (!$adminediting) {
231             foreach ($courses as $course) {
233                 $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
235                 $course->summary .= "<br /><p class=\"category\">";
236                 $course->summary .= "$strcategory: <a href=\"category.php?id=$course->category\">";
237                 $course->summary .= $displaylist[$course->category];
238                 $course->summary .= "</a></p>";
239                 print_course($course, $search);
240                 echo $OUTPUT->spacer(array('height'=>5, 'width'=>5, 'br'=>true)); // should be done with CSS instead
241             }
242         } else {
243         /// Show editing UI.
244             echo "<form id=\"movecourses\" action=\"search.php\" method=\"post\">\n";
245             echo "<div><input type=\"hidden\" name=\"sesskey\" value=\"".sesskey()."\" />\n";
246             echo "<input type=\"hidden\" name=\"search\" value=\"".s($search)."\" />\n";
247             echo "<input type=\"hidden\" name=\"page\" value=\"$page\" />\n";
248             echo "<input type=\"hidden\" name=\"perpage\" value=\"$perpage\" /></div>\n";
249             echo "<table border=\"0\" cellspacing=\"2\" cellpadding=\"4\" class=\"generalbox boxaligncenter\">\n<tr>\n";
250             echo "<th scope=\"col\">$strcourses</th>\n";
251             echo "<th scope=\"col\">$strcategory</th>\n";
252             echo "<th scope=\"col\">$strselect</th>\n";
253             echo "<th scope=\"col\">$stredit</th></tr>\n";
255             foreach ($courses as $course) {
257                 $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
259                 $linkcss = $course->visible ? "" : " class=\"dimmed\" ";
261                 // are we displaying the front page (courseid=1)?
262                 if ($course->id == 1) {
263                     echo "<tr>\n";
264                     echo "<td><a href=\"$CFG->wwwroot\">$strfrontpage</a></td>\n";
266                     // can't do anything else with the front page
267                     echo "  <td>&nbsp;</td>\n"; // category place
268                     echo "  <td>&nbsp;</td>\n"; // select place
269                     echo "  <td>&nbsp;</td>\n"; // edit place
270                     echo "</tr>\n";
271                     continue;
272                 }
274                 echo "<tr>\n";
275                 echo "<td><a $linkcss href=\"view.php?id=$course->id\">"
276                     . highlight($search, format_string($course->fullname)) . "</a></td>\n";
277                 echo "<td>".$displaylist[$course->category]."</td>\n";
278                 echo "<td>\n";
280                 // this is ok since this will get inherited from course category context
281                 // if it is set
282                 if (has_capability('moodle/category:manage', $coursecontext)) {
283                     echo "<input type=\"checkbox\" name=\"c$course->id\" />\n";
284                 } else {
285                     echo "<input type=\"checkbox\" name=\"c$course->id\" disabled=\"disabled\" />\n";
286                 }
288                 echo "</td>\n";
289                 echo "<td>\n";
291                 // checks whether user can update course settings
292                 if (has_capability('moodle/course:update', $coursecontext)) {
293                     echo "<a title=\"".get_string("settings")."\" href=\"$CFG->wwwroot/course/edit.php?id=$course->id\">\n<img".
294                         " src=\"" . $OUTPUT->pix_url('t/edit') . "\" class=\"iconsmall\" alt=\"".get_string("settings")."\" /></a>\n ";
295                 }
297                 // checks whether user can do role assignment
298                 if (has_capability('moodle/course:enrolreview', $coursecontext)) {
299                     echo'<a title="'.get_string('enrolledusers', 'enrol').'" href="'.$CFG->wwwroot.'/enrol/users.php?id='.$course->id.'">';
300                     echo '<img src="'.$OUTPUT->pix_url('i/users') . '" class="iconsmall" alt="'.get_string('enrolledusers', 'enrol').'" /></a> ' . "\n";
301                 }
303                 // checks whether user can delete course
304                 if (has_capability('moodle/course:delete', $coursecontext)) {
305                     echo "<a title=\"".get_string("delete")."\" href=\"delete.php?id=$course->id\">\n<img".
306                         " src=\"" . $OUTPUT->pix_url('t/delete') . "\" class=\"iconsmall\" alt=\"".get_string("delete")."\" /></a>\n ";
307                 }
309                 // checks whether user can change visibility
310                 if (has_capability('moodle/course:visibility', $coursecontext)) {
311                     if (!empty($course->visible)) {
312                         echo "<a title=\"".get_string("hide")."\" href=\"search.php?search=$encodedsearch&amp;perpage=$perpage&amp;page=$page&amp;hide=$course->id&amp;sesskey=".sesskey()."\">\n<img".
313                             " src=\"" . $OUTPUT->pix_url('t/hide') . "\" class=\"iconsmall\" alt=\"".get_string("hide")."\" /></a>\n ";
314                     } else {
315                         echo "<a title=\"".get_string("show")."\" href=\"search.php?search=$encodedsearch&amp;perpage=$perpage&amp;page=$page&amp;show=$course->id&amp;sesskey=".sesskey()."\">\n<img".
316                             " src=\"" . $OUTPUT->pix_url('t/show') . "\" class=\"iconsmall\" alt=\"".get_string("show")."\" /></a>\n ";
317                     }
318                 }
320                 // checks whether user can do site backup
321                 if (has_capability('moodle/backup:backupcourse', $coursecontext)) {
322                     echo "<a title=\"".get_string("backup")."\" href=\"../backup/backup.php?id=$course->id\">\n<img".
323                         " src=\"" . $OUTPUT->pix_url('t/backup') . "\" class=\"iconsmall\" alt=\"".get_string("backup")."\" /></a>\n ";
324                 }
326                 // checks whether user can do restore
327                 if (has_capability('moodle/restore:restorecourse', $coursecontext)) {
328                     echo "<a title=\"".get_string("restore")."\" href=\"../files/index.php?id=$course->id&amp;wdir=/backupdata\">\n<img".
329                         " src=\"" . $OUTPUT->pix_url('t/restore') . "\" class=\"iconsmall\" alt=\"".get_string("restore")."\" /></a>\n ";
330                 }
332                 echo "</td>\n</tr>\n";
333             }
334             echo "<tr>\n<td colspan=\"4\" style=\"text-align:center\">\n";
335             echo "<br />";
336             echo "<input type=\"button\" onclick=\"checkall()\" value=\"$strselectall\" />\n";
337             echo "<input type=\"button\" onclick=\"checknone()\" value=\"$strdeselectall\" />\n";
338             echo html_writer::select($displaylist, 'moveto', '', array(''=>get_string('moveselectedcoursesto')), array('id'=>'movetoid'));
339             $PAGE->requires->js_init_call('M.util.init_select_autosubmit', array('movecourses', 'movetoid', false));
340             echo "</td>\n</tr>\n";
341             echo "</table>\n</form>";
343         }
345         print_navigation_bar($totalcount,$page,$perpage,$encodedsearch,$modulelink);
347     } else {
348         if (!empty($search)) {
349             echo $OUTPUT->heading(get_string("nocoursesfound",'', s($search)));
350         }
351         else {
352             echo $OUTPUT->heading( $strnovalidcourses );
353         }
354     }
356     echo "<br /><br />";
358     print_course_search($search);
360     echo $OUTPUT->footer();
362    /**
363      * Print a list navigation bar
364      * Display page numbers, and a link for displaying all entries
365      * @param integer $totalcount - number of entry to display
366      * @param integer $page - page number
367      * @param integer $perpage - number of entry per page
368      * @param string $encodedsearch
369      * @param string $modulelink - module name
370      */
371     function print_navigation_bar($totalcount,$page,$perpage,$encodedsearch,$modulelink) {
372         global $OUTPUT;
373         echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "search.php?search=$encodedsearch".$modulelink."&perpage=$perpage");
375         //display
376         if ($perpage != 99999 && $totalcount > $perpage) {
377             echo "<center><p>";
378             echo "<a href=\"search.php?search=$encodedsearch".$modulelink."&amp;perpage=99999\">".get_string("showall", "", $totalcount)."</a>";
379             echo "</p></center>";
380         } else if ($perpage === 99999) {
381             $defultprepage = 10;
382             //If user has course:create or category:manage capability the show 30 records.
383             $capabilities = array('moodle/course:create', 'moodle/category:manage');
384             if (has_any_capability($capabilities, get_context_instance(CONTEXT_SYSTEM))) {
385                 $defultprepage = 30;
386             }
388             echo "<center><p>";
389             echo "<a href=\"search.php?search=$encodedsearch".$modulelink."&amp;perpage=".$defultprepage."\">".get_string("showperpage", "", $defultprepage)."</a>";
390             echo "</p></center>";
391         }
392     }