31f97c8c6cc80cad4554f7d2aba2b51f31a4116f
[moodle.git] / course / search.php
1 <?php // $Id$
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_ALPHAEXT);
18     $search = trim(strip_tags($search)); // trim & clean raw searched string
20     if ($search) {
21         $searchterms = explode(" ", $search);    // Search for words independently
22         foreach ($searchterms as $key => $searchterm) {
23             if (strlen($searchterm) < 2) {
24                 unset($searchterms[$key]);
25             }
26         }
27         $search = trim(implode(" ", $searchterms));
28     }
30     $site = get_site();
32     if ($CFG->forcelogin) {
33         require_login();
34     }
36     if (update_category_button()) {
37         if ($edit !== -1) {
38             $USER->categoryediting = $edit;
39         }
40         $adminediting = !empty($USER->categoryediting);
41     } else {
42         $adminediting = false;
43     }
45 /// Editing functions
46     if (has_capability('moodle/course:visibility', get_context_instance(CONTEXT_SYSTEM))) {
47     /// Hide or show a course
48         if ($hide or $show and confirm_sesskey()) {
49             if ($hide) {
50                 $course = $DB->get_record("course", array("id"=>$hide));
51                 $visible = 0;
52             } else {
53                 $course = $DB->get_record("course", array("id"=>$show));
54                 $visible = 1;
55             }
56             if ($course) {
57                 if (! $DB->set_field("course", "visible", $visible, array("id"=>$course->id))) {
58                     notify("Could not update that course!");
59                 }
60             }
61         }
62     }
64     if (has_capability('moodle/course:create', get_context_instance(CONTEXT_SYSTEM)) && $perpage != 99999) {
65         $perpage = 30;
66     }
68     $displaylist = array();
69     $parentlist = array();
70     make_categories_list($displaylist, $parentlist);
72     $strcourses = get_string("courses");
73     $strsearch = get_string("search");
74     $strsearchresults = get_string("searchresults");
75     $strcategory = get_string("category");
76     $strselect   = get_string("select");
77     $strselectall = get_string("selectall");
78     $strdeselectall = get_string("deselectall");
79     $stredit = get_string("edit");
80     $strfrontpage = get_string('frontpage', 'admin');
81     $strnovalidcourses = get_string('novalidcourses');
83     if (empty($search) and empty($blocklist) and empty($modulelist)) {
84         $navlinks = array();
85         $navlinks[] = array('name' => $strcourses, 'link' => "index.php", 'type' => 'misc');
86         $navlinks[] = array('name' => $strsearch, 'link' => null, 'type' => 'misc');
87         $navigation = build_navigation($navlinks);
89         print_header("$site->fullname : $strsearch", $site->fullname, $navigation, "", "");
90         print_simple_box_start("center");
91         echo "<center>";
92         echo "<br />";
93         print_course_search("", false, "plain");
94         echo "<br /><p>";
95         print_string("searchhelp");
96         echo "</p>";
97         echo "</center>";
98         print_simple_box_end();
99         print_footer();
100         exit;
101     }
103     if (!empty($moveto) and $data = data_submitted() and confirm_sesskey()) {   // Some courses are being moved
104         if (! $destcategory = $DB->get_record("course_categories", array("id"=>$data->moveto))) {
105             print_error('cannotfindcategory', '', '', $data->moveto);
106         }
108         $courses = array();
109         foreach ( $data as $key => $value ) {
110             if (preg_match('/^c\d+$/', $key)) {
111                 array_push($courses, substr($key, 1));
112             }
113         }
114         move_courses($courses, $data->moveto);
115     }
117     // get list of courses containing blocks if required
118     if (!empty($blocklist) and confirm_sesskey()) {
119         $blockid = $blocklist;
120         if (!$blocks = $DB->get_records('block_instance', array('blockid'=>$blockid))) {
121             print_error('blockcannotread', '', '',  $blockid);
122         }
124         // run through blocks and get (unique) courses
125         $courses = array();
126         foreach ($blocks as $block) {
127             $courseid = $block->pageid;
128             // MDL-11167, blocks can be placed on mymoodle, or the blogs page
129             // and it should not show up on course search page
130             if ($courseid==0 || $block->pagetype != 'course-view') {
131                 continue;
132             }
133             if (!$course = $DB->get_record('course', array('id'=>$courseid))) {
134                 print_error('invalidcourseid', '', '', $courseid);
135             }
136             $courses[$courseid] = $course;
137         }
138         $totalcount = count( $courses );
139     }
140     // get list of courses containing modules if required
141     elseif (!empty($modulelist) and confirm_sesskey()) {
142         $modulename = $modulelist;
143         $sql =  "SELECT DISTINCT c.id FROM {".$modulelist."} module, {course} c"
144             ." WHERE module.course=c.id";
146         $courseids = $DB->get_records_sql($sql);
147         $courses = array();
148         if (!empty($courseids)) {
149             $firstcourse = $page*$perpage;
150             $lastcourse = $page*$perpage + $perpage -1;
151             $i = 0;
152             foreach ($courseids as $courseid) {
153                 if ($i>= $firstcourse && $i<=$lastcourse) {
154                     $courses[$courseid->id] = $DB->get_record('course', array('id'=> $courseid->id));
155                 }
156                 $i++;
157             }
158             $totalcount = count($courseids);
159         }
160         else {
161             $totalcount = 0;
162         }
163     }
164     else {
165         $courses = get_courses_search($searchterms, "fullname ASC",
166             $page, $perpage, $totalcount);
167     }
169     $searchform = print_course_search($search, true, "navbar");
171     if (!empty($courses) && has_capability('moodle/course:create', get_context_instance(CONTEXT_SYSTEM))) {
172         $searchform .= update_categories_search_button($search,$page,$perpage);
173     }
175     $navlinks = array();
176     $navlinks[] = array('name' => $strcourses, 'link' => 'index.php', 'type' => 'misc');
177     $navlinks[] = array('name' => $strsearch, 'link' => 'search.php', 'type' => 'misc');
178     $navlinks[] = array('name' => "'".s($search)."'", 'link' => null, 'type' => 'misc');
179     $navigation = build_navigation($navlinks);
181     print_header("$site->fullname : $strsearchresults", $site->fullname, $navigation, "", "", "", $searchform);
183     $lastcategory = -1;
184     if ($courses) {
185         print_heading("$strsearchresults: $totalcount");
186         $encodedsearch = urlencode($search);
188      ///add the module parameter to the paging bar if they exists
189         $modulelink = "";
190         if (!empty($modulelist) and confirm_sesskey()) {
191             $modulelink = "&amp;modulelist=".$modulelist."&amp;sesskey=".sesskey();
192         }
194         print_navigation_bar($totalcount, $page, $perpage, $encodedsearch, $modulelink);
196         if (!$adminediting) {
197             foreach ($courses as $course) {
198                 $course->summary .= "<br /><p class=\"category\">";
199                 $course->summary .= "$strcategory: <a href=\"category.php?id=$course->category\">";
200                 $course->summary .= $displaylist[$course->category];
201                 $course->summary .= "</a></p>";
202                 print_course($course, $search);
203                 print_spacer(5,5);
204             }
205         } else {
206         /// Show editing UI.
207             echo "<form id=\"movecourses\" action=\"search.php\" method=\"post\">\n";
208             echo "<div><input type=\"hidden\" name=\"sesskey\" value=\"".sesskey()."\" />\n";
209             echo "<input type=\"hidden\" name=\"search\" value=\"".s($search)."\" />\n";
210             echo "<input type=\"hidden\" name=\"page\" value=\"$page\" />\n";
211             echo "<input type=\"hidden\" name=\"perpage\" value=\"$perpage\" /></div>\n";
212             echo "<table border=\"0\" cellspacing=\"2\" cellpadding=\"4\" class=\"generalbox boxaligncenter\">\n<tr>\n";
213             echo "<th scope=\"col\">$strcourses</th>\n";
214             echo "<th scope=\"col\">$strcategory</th>\n";
215             echo "<th scope=\"col\">$strselect</th>\n";
216             echo "<th scope=\"col\">$stredit</th></tr>\n";
218             foreach ($courses as $course) {
220                 if (isset($course->context)) {
221                     $coursecontext = $course->context;
222                 } else {
223                     $coursecontext = get_context_instance(CONTEXT_COURSE, $course->id);
224                 }
226                 $linkcss = $course->visible ? "" : " class=\"dimmed\" ";
228                 // are we displaying the front page (courseid=1)?
229                 if ($course->id == 1) {
230                     echo "<tr>\n";
231                     echo "<td><a href=\"$CFG->wwwroot\">$strfrontpage</a></td>\n";
233                     // can't do anything else with the front page
234                     echo "  <td>&nbsp;</td>\n"; // category place
235                     echo "  <td>&nbsp;</td>\n"; // select place
236                     echo "  <td>&nbsp;</td>\n"; // edit place
237                     echo "</tr>\n";
238                     continue;
239                 }
241                 echo "<tr>\n";
242                 echo "<td><a $linkcss href=\"view.php?id=$course->id\">"
243                     . highlight($search, format_string($course->fullname)) . "</a></td>\n";
244                 echo "<td>".$displaylist[$course->category]."</td>\n";
245                 echo "<td>\n";
247                 // this is ok since this will get inherited from course category context
248                 // if it is set
249                 if (has_capability('moodle/category:manage', $coursecontext)) {
250                     echo "<input type=\"checkbox\" name=\"c$course->id\" />\n";
251                 } else {
252                     echo "<input type=\"checkbox\" name=\"c$course->id\" disabled=\"disabled\" />\n";
253                 }
255                 echo "</td>\n";
256                 echo "<td>\n";
257                 $pixpath = $CFG->pixpath;
259                 // checks whether user can update course settings
260                 if (has_capability('moodle/course:update', $coursecontext)) {
261                     echo "<a title=\"".get_string("settings")."\" href=\"$CFG->wwwroot/course/edit.php?id=$course->id\">\n<img".
262                         " src=\"$pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"".get_string("settings")."\" /></a>\n ";
263                 }
265                 // checks whether user can do role assignment
266                 if (has_capability('moodle/role:assign', $coursecontext)) {
267                     echo'<a title="'.get_string('assignroles', 'role').'" href="'.$CFG->wwwroot.'/'.$CFG->admin.'/roles/assign.php?contextid='.$coursecontext->id.'">';
268                     echo '<img src="'.$CFG->pixpath.'/i/roles.gif" class="iconsmall" alt="'.get_string('assignroles', 'role').'" /></a> ' . "\n";
269                 }
271                 // checks whether user can delete course
272                 if (has_capability('moodle/course:delete', $coursecontext)) {
273                     echo "<a title=\"".get_string("delete")."\" href=\"delete.php?id=$course->id\">\n<img".
274                         " src=\"$pixpath/t/delete.gif\" class=\"iconsmall\" alt=\"".get_string("delete")."\" /></a>\n ";
275                 }
277                 // checks whether user can change visibility
278                 if (has_capability('moodle/course:visibility', $coursecontext)) {
279                     if (!empty($course->visible)) {
280                         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".
281                             " src=\"$pixpath/t/hide.gif\" class=\"iconsmall\" alt=\"".get_string("hide")."\" /></a>\n ";
282                     } else {
283                         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".
284                             " src=\"$pixpath/t/show.gif\" class=\"iconsmall\" alt=\"".get_string("show")."\" /></a>\n ";
285                     }
286                 }
288                 // checks whether user can do site backup
289                 if (has_capability('moodle/site:backup', $coursecontext)) {
290                     echo "<a title=\"".get_string("backup")."\" href=\"../backup/backup.php?id=$course->id\">\n<img".
291                         " src=\"$pixpath/t/backup.gif\" class=\"iconsmall\" alt=\"".get_string("backup")."\" /></a>\n ";
292                 }
294                 // checks whether user can do restore
295                 if (has_capability('moodle/site:restore', $coursecontext)) {
296                     echo "<a title=\"".get_string("restore")."\" href=\"../files/index.php?id=$course->id&amp;wdir=/backupdata\">\n<img".
297                         " src=\"$pixpath/t/restore.gif\" class=\"iconsmall\" alt=\"".get_string("restore")."\" /></a>\n ";
298                 }
300                 echo "</td>\n</tr>\n";
301             }
302             echo "<tr>\n<td colspan=\"4\" style=\"text-align:center\">\n";
303             echo "<br />";
304             echo "<input type=\"button\" onclick=\"checkall()\" value=\"$strselectall\" />\n";
305             echo "<input type=\"button\" onclick=\"checknone()\" value=\"$strdeselectall\" />\n";
306             choose_from_menu ($displaylist, "moveto", "", get_string("moveselectedcoursesto"), "javascript: getElementById('movecourses').submit()");
307             echo "</td>\n</tr>\n";
308             echo "</table>\n</form>";
310         }
312         print_navigation_bar($totalcount,$page,$perpage,$encodedsearch,$modulelink);
314     } else {
315         if (!empty($search)) {
316             print_heading(get_string("nocoursesfound", "", s($search)));
317         }
318         else {
319             print_heading( $strnovalidcourses );
320         }
321     }
323     echo "<br /><br />";
325     print_course_search($search);
327     print_footer();
329    /**
330      * Print a list navigation bar
331      * Display page numbers, and a link for displaying all entries
332      * @param integer $totalcount - number of entry to display
333      * @param integer $page - page number
334      * @param integer $perpage - number of entry per page
335      * @param string $encodedsearch
336      * @param string $modulelink - module name
337      */
338     function print_navigation_bar($totalcount,$page,$perpage,$encodedsearch,$modulelink) {
339         print_paging_bar($totalcount, $page, $perpage, "search.php?search=$encodedsearch".$modulelink."&amp;perpage=$perpage&amp;",'page',($perpage == 99999));
341         //display
342         if ($perpage != 99999 && $totalcount > $perpage) {
343             echo "<center><p>";
344             echo "<a href=\"search.php?search=$encodedsearch".$modulelink."&amp;perpage=99999\">".get_string("showall", "", $totalcount)."</a>";
345             echo "</p></center>";
346         }
347     }
349 ?>