moodle_page: MDL-12212 reimplement user_is_editing, deprecate isediting
[moodle.git] / course / index.php
1 <?php // $Id$
2       // For most people, just lists the course categories
3       // Allows the admin to create, delete and rename course categories
5     require_once("../config.php");
6     require_once("lib.php");
8     $categoryedit = optional_param('categoryedit', -1,PARAM_BOOL);
9     $delete   = optional_param('delete',0,PARAM_INT);
10     $hide     = optional_param('hide',0,PARAM_INT);
11     $show     = optional_param('show',0,PARAM_INT);
12     $move     = optional_param('move',0,PARAM_INT);
13     $moveto   = optional_param('moveto',-1,PARAM_INT);
14     $moveup   = optional_param('moveup',0,PARAM_INT);
15     $movedown = optional_param('movedown',0,PARAM_INT);
17     if ($CFG->forcelogin) {
18         require_login();
19     }
21     if (!$site = get_site()) {
22         print_error('siteisnotdefined', 'debug');
23     }
25     $systemcontext = get_context_instance(CONTEXT_SYSTEM);
27     if (update_category_button()) {
28         if ($categoryedit !== -1) {
29             $USER->editing = $categoryedit;
30         }
31         $adminediting = $PAGE->user_is_editing();
32     } else {
33         $adminediting = false;
34     }
36     $stradministration = get_string('administration');
37     $strcategories = get_string('categories');
38     $strcategory = get_string('category');
39     $strcourses = get_string('courses');
40     $stredit = get_string('edit');
41     $strdelete = get_string('delete');
42     $straction = get_string('action');
45 /// Unless it's an editing admin, just print the regular listing of courses/categories
46     if (!$adminediting) {
48     /// Print form for creating new categories
49         $countcategories = $DB->count_records('course_categories');
51         if ($countcategories > 1 || ($countcategories == 1 && $DB->count_records('course') > 200)) {
52             $strcourses = get_string('courses');
53             $strcategories = get_string('categories');
55             $navlinks = array();
56             $navlinks[] = array('name'=>$strcategories,'link'=>'','type'=>'misc');
57             $navigation = build_navigation($navlinks);
58             print_header("$site->shortname: $strcategories", $strcourses, $navigation, '', '', true, update_category_button());
59             print_heading($strcategories);
60             echo skip_main_destination();
61             print_box_start('categorybox');
62             print_whole_category_list();
63             print_box_end();
64             print_course_search();
65         } else {
66             $strfulllistofcourses = get_string('fulllistofcourses');
67             print_header("$site->shortname: $strfulllistofcourses", $strfulllistofcourses,
68                     build_navigation(array(array('name'=>$strfulllistofcourses, 'link'=>'','type'=>'misc'))),
69                          '', '', true, update_category_button());
70             echo skip_main_destination();
71             print_box_start('courseboxes');
72             print_courses(0);
73             print_box_end();
74         }
76         echo '<div class="buttons">';
77         if (has_capability('moodle/course:create', $systemcontext)) {
78         /// Print link to create a new course
79         /// Get the 1st available category
80             $options = array('category' => $CFG->defaultrequestcategory);
81             print_single_button('edit.php', $options, get_string('addnewcourse'), 'get');
82         }
83         print_course_request_buttons($systemcontext);
84         echo '</div>';
85         print_footer();
86         exit;
87     }
88 /// Everything else is editing on mode.
90 /// Delete a category.
91     if (!empty($delete) and confirm_sesskey()) {
92         if (!$deletecat = $DB->get_record('course_categories', array('id'=>$delete))) {
93             print_error('invalidcategoryid');
94         }
95         $context = get_context_instance(CONTEXT_COURSECAT, $delete);
96         require_capability('moodle/category:manage', $context);
97         require_capability('moodle/category:manage', get_category_or_system_context($deletecat->parent));
99         $heading = get_string('deletecategory', '', format_string($deletecat->name));
100         require_once('delete_category_form.php');
101         $mform = new delete_category_form(null, $deletecat);
102         $mform->set_data(array('delete'=>$delete));
104         if ($mform->is_cancelled()) {
105             redirect('index.php');
107         } else if (!$data= $mform->get_data()) {
108             require_once($CFG->libdir . '/questionlib.php');
109             print_category_edit_header();
110             print_heading($heading);
111             $mform->display();
112             admin_externalpage_print_footer();
113             exit();
114         }
116         print_category_edit_header();
117         print_heading($heading);
119         if ($data->fulldelete) {
120             $deletedcourses = category_delete_full($deletecat, true);
121             
122             foreach($deletedcourses as $course) {
123                 notify(get_string('coursedeleted', '', $course->shortname), 'notifysuccess');
124             }
125             notify(get_string('coursecategorydeleted', '', format_string($deletecat->name)), 'notifysuccess');
126             
127         } else {
128             category_delete_move($deletecat, $data->newparent, true);
129         }
131         // If we deleted $CFG->defaultrequestcategory, make it point somewhere else.
132         if ($delete == $CFG->defaultrequestcategory) {
133             set_config('defaultrequestcategory', $DB->get_field('course_categories', 'MIN(id)', array('parent'=>0)));
134         }
136         print_continue('index.php');
138         admin_externalpage_print_footer();
139         die;
140     }
142 /// Print headings
143     print_category_edit_header();
144     print_heading($strcategories);
146 /// Create a default category if necessary
147     if (!$categories = get_categories()) {    /// No category yet!
148         // Try and make one
149         $tempcat = new object();
150         $tempcat->name = get_string('miscellaneous');
151         if (!$tempcat->id = $DB->insert_record('course_categories', $tempcat)) {
152             print_error('cannotsetupcategory');
153         }
154         $tempcat->context = get_context_instance(CONTEXT_COURSECAT, $tempcat->id);
155         mark_context_dirty('/'.SYSCONTEXTID);
156         fix_course_sortorder(); // Required to build course_categories.depth and .path.
157     }
159 /// Move a category to a new parent if required
160     if (!empty($move) and ($moveto >= 0) and confirm_sesskey()) {
161         if ($cattomove = $DB->get_record('course_categories', array('id'=>$move))) {
162             require_capability('moodle/category:manage', get_category_or_system_context($cattomove->parent));
163             if ($cattomove->parent != $moveto) {
164                 $newparent = $DB->get_record('course_categories', array('id'=>$moveto));
165                 require_capability('moodle/category:manage', get_category_or_system_context($moveto));
166                 move_category($cattomove, $newparent);
167             }
168         }
169     }
171 /// Hide or show a category
172     if ((!empty($hide) or !empty($show)) and confirm_sesskey()) {
173         if (!empty($hide)) {
174             $tempcat = $DB->get_record('course_categories', array('id'=>$hide));
175             $visible = 0;
176         } else {
177             $tempcat = $DB->get_record('course_categories', array('id'=>$show));
178             $visible = 1;
179         }
180         require_capability('moodle/category:manage', get_category_or_system_context($tempcat->parent));
181         if ($tempcat) {
182             $DB->set_field('course_categories', 'visible', $visible, array('id'=>$tempcat->id));
183             $DB->set_field('course', 'visible', $visible, array('category' => $tempcat->id));
184         }
185     }
187 /// Move a category up or down
188     if ((!empty($moveup) or !empty($movedown)) and confirm_sesskey()) {
189         fix_course_sortorder();
190         $swapcategory = NULL;
192         if (!empty($moveup)) {
193             require_capability('moodle/category:manage', get_context_instance(CONTEXT_COURSECAT, $moveup));
194             if ($movecategory = $DB->get_record('course_categories', array('id'=>$moveup))) {
195                 if ($swapcategory = $DB->get_records_select('course_categories', "sortorder<? AND parent=?", array($movecategory->sortorder, $movecategory->parent), 'sortorder ASC', '*', 0, 1)) {
196                     $swapcategory = reset($swapcategory);
197                 }
198             }
199         } else {
200             require_capability('moodle/category:manage', get_context_instance(CONTEXT_COURSECAT, $movedown));
201             if ($movecategory = $DB->get_record('course_categories', array('id'=>$movedown))) {
202                 if ($swapcategory = $DB->get_records_select('course_categories', "sortorder>? AND parent=?", array($movecategory->sortorder, $movecategory->parent), 'sortorder ASC', '*', 0, 1)) {
203                     $swapcategory = reset($swapcategory);
204                 }
205             }
206         }
207         if ($swapcategory and $movecategory) {
208             $DB->set_field('course_categories', 'sortorder', $swapcategory->sortorder, array('id'=>$movecategory->id));
209             $DB->set_field('course_categories', 'sortorder', $movecategory->sortorder, array('id'=>$swapcategory->id));
210         }
212         // finally reorder courses
213         fix_course_sortorder();
214     }
216 /// Print out the categories with all the knobs
217     $strcategories = get_string('categories');
218     $strcourses = get_string('courses');
219     $strmovecategoryto = get_string('movecategoryto');
220     $stredit = get_string('edit');
222     $displaylist = array();
223     $parentlist = array();
225     $displaylist[0] = get_string('top');
226     make_categories_list($displaylist, $parentlist);
228     echo '<table class="generalbox editcourse boxaligncenter"><tr class="header">';
229     echo '<th class="header" scope="col">'.$strcategories.'</th>';
230     echo '<th class="header" scope="col">'.$strcourses.'</th>';
231     echo '<th class="header" scope="col">'.$stredit.'</th>';
232     echo '<th class="header" scope="col">'.$strmovecategoryto.'</th>';
233     echo '</tr>';
235     print_category_edit(NULL, $displaylist, $parentlist);
236     echo '</table>';
238     echo '<div class="buttons">';
239     if (has_capability('moodle/course:create', $systemcontext)) {
240         // print create course link to first category
241         $options = array();
242         $options = array('category' => $CFG->defaultrequestcategory);
243         print_single_button('edit.php', $options, get_string('addnewcourse'), 'get');
244     }
246     // Print button for creating new categories
247     if (has_capability('moodle/category:manage', $systemcontext)) {
248         $options = array();
249         $options['parent'] = 0;
250         print_single_button('editcategory.php', $options, get_string('addnewcategory'), 'get');
251     }
253     print_course_request_buttons($systemcontext);
254     echo '</div>';
256     admin_externalpage_print_footer();
258 function print_category_edit($category, $displaylist, $parentslist, $depth=-1, $up=false, $down=false) {
259 /// Recursive function to print all the categories ready for editing
261     global $CFG, $USER;
263     static $str = NULL;
265     if (is_null($str)) {
266         $str = new stdClass;
267         $str->edit     = get_string('edit');
268         $str->delete   = get_string('delete');
269         $str->moveup   = get_string('moveup');
270         $str->movedown = get_string('movedown');
271         $str->edit     = get_string('editthiscategory');
272         $str->hide     = get_string('hide');
273         $str->show     = get_string('show');
274         $str->spacer = '<img src="'.$CFG->wwwroot.'/pix/spacer.gif" class="iconsmall" alt="" /> ';
275     }
277     if (!empty($category)) {
279         if (!isset($category->context)) {
280             $category->context = get_context_instance(CONTEXT_COURSECAT, $category->id);
281         }
283         echo '<tr><td align="left" class="name">';
284         for ($i=0; $i<$depth;$i++) {
285             echo '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;';
286         }
287         $linkcss = $category->visible ? '' : ' class="dimmed" ';
288         echo '<a '.$linkcss.' title="'.$str->edit.'" '.
289              ' href="category.php?id='.$category->id.'&amp;categoryedit=on&amp;sesskey='.sesskey().'">'.
290              format_string($category->name).'</a>';
291         echo '</td>';
293         echo '<td class="count">'.$category->coursecount.'</td>';
295         echo '<td class="icons">';    /// Print little icons
297         if (has_capability('moodle/category:manage', $category->context)) {
298             echo '<a title="'.$str->edit.'" href="editcategory.php?id='.$category->id.'"><img'.
299                  ' src="'.$CFG->pixpath.'/t/edit.gif" class="iconsmall" alt="'.$str->edit.'" /></a> ';
301             echo '<a title="'.$str->delete.'" href="index.php?delete='.$category->id.'&amp;sesskey='.sesskey().'"><img'.
302                  ' src="'.$CFG->pixpath.'/t/delete.gif" class="iconsmall" alt="'.$str->delete.'" /></a> ';
304             if (!empty($category->visible)) {
305                 echo '<a title="'.$str->hide.'" href="index.php?hide='.$category->id.'&amp;sesskey='.sesskey().'"><img'.
306                      ' src="'.$CFG->pixpath.'/t/hide.gif" class="iconsmall" alt="'.$str->hide.'" /></a> ';
307             } else {
308                 echo '<a title="'.$str->show.'" href="index.php?show='.$category->id.'&amp;sesskey='.sesskey().'"><img'.
309                      ' src="'.$CFG->pixpath.'/t/show.gif" class="iconsmall" alt="'.$str->show.'" /></a> ';
310             }
312             if ($up) {
313                 echo '<a title="'.$str->moveup.'" href="index.php?moveup='.$category->id.'&amp;sesskey='.sesskey().'"><img'.
314                      ' src="'.$CFG->pixpath.'/t/up.gif" class="iconsmall" alt="'.$str->moveup.'" /></a> ';
315             } else {
316                 echo $str->spacer;
317             }
318             if ($down) {
319                 echo '<a title="'.$str->movedown.'" href="index.php?movedown='.$category->id.'&amp;sesskey='.sesskey().'"><img'.
320                      ' src="'.$CFG->pixpath.'/t/down.gif" class="iconsmall" alt="'.$str->movedown.'" /></a> ';
321             } else {
322                 echo $str->spacer;
323             }
324         }
325         echo '</td>';
327         echo '<td align="left">';
328         if (has_capability('moodle/category:manage', $category->context)) {
329             $tempdisplaylist = $displaylist;
330             unset($tempdisplaylist[$category->id]);
331             foreach ($parentslist as $key => $parents) {
332                 if (in_array($category->id, $parents)) {
333                     unset($tempdisplaylist[$key]);
334                 }
335             }
336             popup_form ("index.php?move=$category->id&amp;sesskey=".sesskey()."&amp;moveto=", $tempdisplaylist, "moveform$category->id", $category->parent, '', '', '', false);
337         }
338         echo '</td>';
339         echo '</tr>';
340     } else {
341         $category->id = '0';
342     }
344     if ($categories = get_categories($category->id)) {   // Print all the children recursively
345         $countcats = count($categories);
346         $count = 0;
347         $first = true;
348         $last = false;
349         foreach ($categories as $cat) {
350             $count++;
351             if ($count == $countcats) {
352                 $last = true;
353             }
354             $up = $first ? false : true;
355             $down = $last ? false : true;
356             $first = false;
358             print_category_edit($cat, $displaylist, $parentslist, $depth+1, $up, $down);
359         }
360     }
363 function print_category_edit_header() {
364     global $CFG;
365     global $SITE;
367     require_once($CFG->libdir.'/adminlib.php');
368     admin_externalpage_setup('coursemgmt', update_category_button());
369     admin_externalpage_print_header();
371 ?>