diff --git a/course/categories.php b/course/categories.php index 762130ed35c..668466dc8bd 100644 --- a/course/categories.php +++ b/course/categories.php @@ -7,7 +7,7 @@ require_login(); if (!isadmin()) { - error("Only administrators can use this course!"); + error("Only administrators can use this page!"); } if (!$site = get_site()) { @@ -24,80 +24,146 @@ $stredit = get_string("edit"); $strdelete = get_string("delete"); $straction = get_string("action"); - $stradd = get_string("add"); + $straddnewcategory = get_string("addnewcategory"); print_header("$site->shortname: $strcategories", "$site->fullname", - "admin/index.php\">$stradministration -> $strcategories"); + "admin/index.php\">$stradministration -> $strcategories", + "addform.addcategory"); - print_heading($strcategories); -/// If data submitted, then process and store. - - if ($form = data_submitted()) { - - $categories = array(); - - // Peel out all the data from variable names. - foreach ($form as $key => $val) { - if ($key == "new") { - if (!empty($val)) { - if (get_records("course_categories", "name", $val)) { - notify(get_string("categoryduplicate", "", $val)); - } else { - $cat->name = $val; - if (!insert_record("course_categories", $cat)) { - error("Could not insert the new category '$val'"); - } else { - notify(get_string("categoryadded", "", $val)); - } - } - } - +/// If data for a new category was submitted, then add it + if ($form = data_submitted()) { + if (!empty($form->addcategory)) { + unset($newcategory); + $newcategory->name = $form->addcategory; + $newcategory->sortorder = 999; + if (!insert_record("course_categories", $newcategory)) { + notify("Could not insert the new category '$newcategory->name'"); } else { - $cat->id = substr($key,1); - $cat->name = $val; + notify(get_string("categoryadded", "", $newcategory->name)); + } + } + } - if ($existingcats = get_records("course_categories", "name", $val)) { - foreach($existingcats as $existingcat) { - if ($existingcat->id != $cat->id) { - notify(get_string("categoryduplicate", "", $val)); - continue 2; - } + +/// Delete a category if necessary + + if (isset($delete)) { + if ($tempcat = get_record("course_categories", "id", $delete)) { + if (delete_records("course_categories", "id", $tempcat->id)) { + notify(get_string("categorydeleted", "", $tempcat->name)); + } + if ($children = get_records("course_categories", "parent", $tempcat->id)) { + foreach ($children as $childcat) { + if (! set_field("course_categories", "parent", $tempcat->parent, "id", $childcat->id)) { + notify("Could not update a child category!"); } } - - if (!update_record("course_categories", $cat)) { - error("Could not update the category '$val'"); - } } } - } + } -/// Get the existing categories - if (!$categories = get_categories()) { +/// Create a default category if necessary + if (!$categories = get_categories()) { /// No category yet! // Try and make one - $cat->name = get_string("miscellaneous"); - if ($cat->id = insert_record("course_categories", $cat)) { - $categories[$cat->id] = $cat; - } else { + unset($tempcat); + $tempcat->name = get_string("miscellaneous"); + if (!$tempcat->id = insert_record("course_categories", $tempcat)) { error("Serious error: Could not create a default category!"); } } -/// Delete category if the user wants to delete it - if (isset($delete)) { - if (delete_records("course_categories", "id", $delete)) { - notify(get_string("categorydeleted", "", $categories[$delete]->name)); - unset($categories[$delete]); - } else { - error("An error occurred while trying to delete a category"); + +/// Move a category to a new parent if required + + if (isset($move) and isset($moveto)) { + if ($tempcat = get_record("course_categories", "id", $move)) { + if ($tempcat->parent != $moveto) { + if (! set_field("course_categories", "parent", $moveto, "id", $tempcat->id)) { + notify("Could not update that category!"); + } + } } } -/// Find lowest ID category - this is the default category + +/// Hide or show a category + if (isset($hide) or isset($show)) { + if (isset($hide)) { + $tempcat = get_record("course_categories", "id", $hide); + $visible = 0; + } else { + $tempcat = get_record("course_categories", "id", $show); + $visible = 1; + } + if ($tempcat) { + if (! set_field("course_categories", "visible", $visible, "id", $tempcat->id)) { + notify("Could not update that category!"); + } + if (! set_field("course", "visible", $visible, "category", $tempcat->id)) { + notify("Could not hide/show any courses in this category !"); + } + } + } + + +/// Move a category up or down + + if (isset($moveup) or isset($movedown)) { + + $swapcategory = NULL; + $movecategory = NULL; + + if (isset($moveup)) { + if ($movecategory = get_record("course_categories", "id", $moveup)) { + $categories = get_categories("$movecategory->parent"); + + foreach ($categories as $category) { + if ($category->id == $movecategory->id) { + break; + } + $swapcategory = $category; + } + } + } + if (isset($movedown)) { + if ($movecategory = get_record("course_categories", "id", $movedown)) { + $categories = get_categories("$movecategory->parent"); + + $choosenext = false; + foreach ($categories as $category) { + if ($choosenext) { + $swapcategory = $category; + break; + } + if ($category->id == $movecategory->id) { + $choosenext = true; + } + } + } + } + if ($swapcategory and $movecategory) { // Renumber everything for robustness + $count=0; + foreach ($categories as $category) { + $count++; + if ($category->id == $swapcategory->id) { + $category = $movecategory; + } else if ($category->id == $movecategory->id) { + $category = $swapcategory; + } + if (! set_field("course_categories", "sortorder", $count, "id", $category->id)) { + notify("Could not update that category!"); + } + } + } + } + +/// Find the default category (the one with the lowest ID) + $categories = get_categories(); $default = 99999; foreach ($categories as $category) { + fix_category_courses($category->id); if ($category->id < $default) { $default = $category->id; } @@ -112,30 +178,141 @@ } } +/// Print form for creating new categories -/// Print the table of all categories - $table->head = array ($strcategory, $strcourses, $straction); - $table->align = array ("LEFT", "CENTER", "CENTER"); - $table->size = array ("80", "50", "50"); - $table->width = 100; + print_simple_box_start("center"); + echo "
"; + echo "
"; + echo ""; + echo ""; + echo "
"; + echo "
"; + print_simple_box_end(); + + echo "
"; + + +/// Print out the categories with all the knobs + + $strcategories = get_string("categories"); + $strmovecategoryto = get_string("movecategoryto"); + $stredit = get_string("edit"); + + $displaylist = array(); + $parentlist = array(); + + $displaylist[0] = get_string("top"); + make_categories_list($displaylist, $parentlist, ""); + + echo ""; + echo ""; + echo ""; + echo ""; + + print_category_edit(NULL, $displaylist, $parentlist); + + echo "
$strcategories$stredit$strmovecategoryto
"; - echo "
"; - foreach ($categories as $category) { - $count = count_records("course", "category", $category->id); - if ($category->id == $default) { - $delete = ""; // Can't delete default category - } else { - $delete = "id\">$strdelete"; - } - $table->data[] = array ("id\" VALUE=\"$category->name\" SIZE=30>", - "id\">$count", $delete); - } - $table->data[] = array ("", "", "$stradd"); - print_table($table); - echo "

"; - echo "
"; - echo "
"; print_footer(); + + +function print_category_edit($category, $displaylist, $parentslist, $depth=-1, $up=false, $down=false) { +/// Recursive function to print all the categories ready for editing + + global $THEME, $CFG; + + static $str = ''; + static $pixpath = ''; + + if (empty($str)) { + $str->delete = get_string("delete"); + $str->moveup = get_string("moveup"); + $str->movedown = get_string("movedown"); + $str->edit = get_string("editthiscategory"); + $str->hide = get_string("hide"); + $str->show = get_string("show"); + } + + if (empty($pixpath)) { + if (empty($THEME->custompix)) { + $pixpath = "$CFG->wwwroot/pix"; + } else { + $pixpath = "$CFG->wwwroot/theme/$CFG->theme/pix"; + } + } + + if ($category) { + echo "cellcontent\">"; + echo "

"; + for ($i=0; $i<$depth;$i++) { + echo "      "; + } + $linkcss = $category->visible ? "" : " class=\"dimmed\" "; + echo "edit\" href=\"category.php?id=$category->id\">$category->name"; + echo "

"; + echo ""; + + echo ""; /// Print little icons + + if (!empty($category->visible)) { + echo "hide\" href=\"categories.php?hide=$category->id\"> "; + } else { + echo "show\" href=\"categories.php?show=$category->id\"> "; + } + + echo "delete\" href=\"categories.php?delete=$category->id\"> "; + + //echo "update\" href=\"category.php?id=$category->id\"> "; + + if ($up) { + echo "moveup\" href=\"categories.php?moveup=$category->id\"> "; + } + if ($down) { + echo "movedown\" href=\"categories.php?movedown=$category->id\"> "; + } + echo ""; + + echo ""; + $tempdisplaylist = $displaylist; + unset($tempdisplaylist[$category->id]); + foreach ($parentslist as $key => $parents) { + if (in_array($category->id, $parents)) { + unset($tempdisplaylist[$key]); + } + } + popup_form ("categories.php?move=$category->id&moveto=", $tempdisplaylist, "moveform$category->id", "$category->parent", "", "", "", false); + echo ""; + echo ""; + } else { + $category->id = "0"; + } + + if ($categories = get_categories($category->id)) { // Print all the children recursively + $countcats = count($categories); + $count = 0; + $first = true; + $last = false; + foreach ($categories as $cat) { + $count++; + if ($count == $countcats) { + $last = true; + } + $up = $first ? false : true; + $down = $last ? false : true; + $first = false; + + print_category_edit($cat, $displaylist, $parentslist, $depth+1, $up, $down); + } + } +} + + ?> diff --git a/course/category.php b/course/category.php new file mode 100644 index 00000000000..35a6d680447 --- /dev/null +++ b/course/category.php @@ -0,0 +1,220 @@ +shortname: $strcategory", "$site->fullname", + "admin/index.php\">$stradministration -> ". + "$strcategories -> $strcategory"); + + +/// Rename the category + + if (!empty($rename)) { + $category->name = $rename; + if (! set_field("course_categories", "name", $category->name, "id", $category->id)) { + notify("An error occurred while renaming the category"); + } else { + notify("The category was renamed"); + } + } + +/// Print the category selector + + $displaylist = array(); + $parentlist = array(); + + make_categories_list($displaylist, $parentlist, ""); + + echo "
"; + popup_form("category.php?id=", $displaylist, "switchcategory", "$category->id", "", "", "", false); + echo "

"; + + +/// Move a specified course to a new category + + if (isset($move) and isset($moveto)) { + if (! $course = get_record("course", "id", $move)) { + notify("Error finding the course"); + } else if (! $destcategory = get_record("course_categories", "id", $moveto)) { + notify("Error finding the category"); + } else { + if (!set_field("course", "category", $destcategory->id, "id", $course->id)) { + notify("An error occurred - course not moved!"); + } + fix_category_courses($destcategory->id); + fix_category_courses($category->id); + $category = get_record("course_categories", "id", $category->id); + } + } + + +/// Hide or show a course + + if (isset($hide) or isset($show)) { + if (isset($hide)) { + $course = get_record("course", "id", $hide); + $visible = 0; + } else { + $course = get_record("course", "id", $show); + $visible = 1; + } + if ($course) { + if (! set_field("course", "visible", $visible, "id", $course->id)) { + notify("Could not update that course!"); + } + } + } + + +/// Move a course up or down + + if (isset($moveup) or isset($movedown)) { + + + $movecourse = isset($moveup) ? $moveup : $movedown; + + fix_category_courses($category->id); + if (!$category = get_record("course_categories", "id", $category->id)) { // Fresh copy + error("Category not known!"); + } + + $courses = explode(',', $category->courseorder); + $key = array_search($movecourse, $courses); + if ($key === NULL or $key === false) { + notify("Could not find that course in the category list!"); + + } else { + if (isset($moveup)) { + $swapkey = $key-1; + } else { + $swapkey = $key+1; + } + $courses[$key] = $courses[$swapkey]; + $courses[$swapkey] = $movecourse; + $category->courseorder = implode(",", $courses); + + if (! set_field("course_categories", "courseorder", $category->courseorder, "id", $category->id)) { + notify("Database error while trying to update the category!"); + } + } + } + + +/// Print out the courses with all the knobs + + fix_category_courses($category->id); + + if (!$courses = get_courses($category)) { + print_heading(get_string("nocoursesyet")); + + } else { + + $strcourses = get_string("courses"); + $strmovecourseto = get_string("movecourseto"); + $stredit = get_string("edit"); + $strdelete = get_string("delete"); + $strmoveup = get_string("moveup"); + $strmovedown = get_string("movedown"); + $strupdate = get_string("update"); + $strhide = get_string("hide"); + $strshow = get_string("show"); + + if (empty($THEME->custompix)) { + $pixpath = "$CFG->wwwroot/pix"; + } else { + $pixpath = "$CFG->wwwroot/theme/$CFG->theme/pix"; + } + + echo ""; + echo ""; + echo ""; + echo ""; + + $numcourses = count($courses); + $count = 0; + + foreach ($courses as $course) { + $count++; + $up = ($count == 1) ? false : true; + $down = ($count == $numcourses) ? false : true; + + $linkcss = $course->visible ? "" : " class=\"dimmed\" "; + echo ""; + echo ""; + echo ""; + echo ""; + echo ""; + } + + echo "
$strcourses$stredit$strmovecourseto
id\">$course->fullname"; + if (!empty($course->visible)) { + echo "id&hide=$course->id\"> "; + } else { + echo "id&show=$course->id\"> "; + } + echo "id\"> "; + + if ($up) { + echo "id&moveup=$course->id\"> "; + } + + if ($down) { + echo "id&movedown=$course->id\"> "; + } + + echo ""; + popup_form ("category.php?id=$category->id&move=$course->id&moveto=", $displaylist, + "moveform$course->id", "$course->category", "", "", "", false); + echo "
"; + echo "
"; + } + +/// Print form to rename the category + + $strrename= get_string("rename"); + + print_simple_box_start("center"); + echo "
"; + echo "
"; + echo "id\">"; + echo "name\">"; + echo ""; + echo "
"; + echo "
"; + print_simple_box_end(); + + print_footer(); + +?> diff --git a/course/edit.html b/course/edit.html index 584731387ed..336747e432c 100644 --- a/course/edit.html +++ b/course/edit.html @@ -52,7 +52,9 @@

: categories, "category", "$form->category", ""); + $displaylist = array(); + make_categories_list($displaylist); + choose_from_menu($displaylist, "category", "$form->category", ""); helpbutton("coursecategory", get_string("category")); ?> diff --git a/course/edit.php b/course/edit.php index 7c130d70c49..36c5cb32487 100644 --- a/course/edit.php +++ b/course/edit.php @@ -44,6 +44,8 @@ $form->timemodified = time(); + fix_category_courses($form->category); + if (!empty($course)) { if (update_record("course", $form)) { add_to_log($course->id, "course", "update", "edit.php?id=$id", ""); diff --git a/course/index.php b/course/index.php index 82ad3ee9870..946772e3fe4 100644 --- a/course/index.php +++ b/course/index.php @@ -4,54 +4,45 @@ require_once("../config.php"); require_once("lib.php"); - optional_variable($category, ""); + optional_variable($category, "0"); $strcourses = get_string("courses"); $strcategories = get_string("categories"); $strmycourses = get_string("mycourses"); $strfulllistofcourses = get_string("fulllistofcourses"); - if (!$categories = get_categories()) { - error("Could not find any course categories!"); - } + if ($category = get_record("course_categories", "id", $category)) { + print_header($strcourses, $strcourses, "$strcourses -> $category->name", + "", "", true, update_category_button($category->id)); - if ($category == "all") { - $title = $strfulllistofcourses; - $navigation = "$strcourses -> $title"; - } else if ($category == "my") { - $title = $strmycourses; - $navigation = "$strcourses -> $title"; - } else if (isset($categories[$category])) { - $title = $categories[$category]->name; - $navigation = "$strcourses -> $title"; } else { - $navigation = $strcourses; + print_header($strcourses, $strcourses, $strcourses); + $category->id = 0; } - print_header($strcourses, $strcourses, $navigation); - $showcategories = (count($categories) > 1); - if ($showcategories) { - echo ""; - echo ""; diff --git a/lang/en/moodle.php b/lang/en/moodle.php index 4b2ca830ff6..04c5f045ec1 100644 --- a/lang/en/moodle.php +++ b/lang/en/moodle.php @@ -16,6 +16,7 @@ $string['add'] = "Add"; $string['added'] = "Added \$a"; $string['addinganew'] = "Adding a new \$a"; $string['addinganewto'] = "Adding a new \$a->what to \$a->to"; +$string['addnewcategory'] = "Add new category"; $string['addnewcourse'] = "Add a new course"; $string['addnewuser'] = "Add a new user"; $string['address'] = "Address"; @@ -186,6 +187,7 @@ $string['editinga'] = "Editing a \$a"; $string['editmyprofile'] = "Edit profile"; $string['editsummary'] = "Edit summary"; $string['editthisactivity'] = "Edit this activity"; +$string['editthiscategory'] = "Edit this category"; $string['edituser'] = "Edit user accounts"; $string['email'] = "Email address"; $string['emailformat'] = "Email format"; @@ -276,8 +278,11 @@ $string['formattopics'] = "Topics format"; $string['formatweeks'] = "Weekly format"; $string['formatwiki'] = "Wiki format"; $string['from'] = "From"; +$string['frontpagecategorynames'] = "Show a list of categories"; +$string['frontpagecourselist'] = "Show a list of courses"; $string['frontpagedescription'] = "Front page description"; $string['frontpageformat'] = "Front page format"; +$string['frontpagenews'] = "Show news items"; $string['fulllistofcourses'] = "All courses"; $string['fullprofile'] = "Full profile"; $string['fullname'] = "Full name"; @@ -441,6 +446,8 @@ $string['modulesuccess'] = "\$a tables have been set up correctly"; $string['moodleversion'] = "Moodle Version"; $string['mostrecently'] = "most recently"; $string['move'] = "Move"; +$string['movecategoryto'] = "Move category to:"; +$string['movecourseto'] = "Move course to:"; $string['movedown'] = "Move down"; $string['movefull'] = "Move \$a to this location"; $string['movehere'] = "Move to here"; @@ -609,7 +616,6 @@ $string['showonlytopic'] = "Show only topic \$a"; $string['showonlyweek'] = "Show only week \$a"; $string['showrecent'] = "Show recent activity"; $string['showtheselogs'] = "Show these logs"; -$string['socialheadline'] = "Social forum - latest topics"; $string['showallcourses'] = "Show all courses"; $string['site'] = "Site"; $string['sites'] = "Sites"; @@ -617,6 +623,7 @@ $string['sitelogs'] = "Site logs"; $string['sitenews'] = "Site news"; $string['sitesettings'] = "Site settings"; $string['size'] = "Size"; +$string['socialheadline'] = "Social forum - latest topics"; $string['someallowguest'] = "Some courses may allow guest access"; $string['someerrorswerefound'] = "Some information was missing or incorrect. Look below for details."; $string['startdate'] = "Course start date"; @@ -635,6 +642,7 @@ $string['strftimerecentfull'] = "%%a, %%d %%b %%Y, %%I:%%M %%p"; $string['strftimetime'] = "%%I:%%M %%p"; $string['stringsnotset'] = "The following strings are not defined in \$a"; $string['studentnotallowed'] = "Sorry, but you can not enter this course as '\$a'"; +$string['subcategories'] = "Sub-categories"; $string['success'] = "Success"; $string['summary'] = "Summary"; $string['summaryof'] = "Summary of \$a"; @@ -652,13 +660,14 @@ $string['to'] = "To"; $string['today'] = "Today"; $string['todaylogs'] = "Today's logs"; $string['toomanytoshow'] = "There are too many users to show"; +$string['top'] = "Top"; $string['topic'] = "Topic"; $string['topichide'] = "Hide this topic from \$a"; $string['topicoutline'] = "Topic outline"; $string['topicshow'] = "Show this topic to \$a"; +$string['total'] = "Total"; $string['turneditingoff'] = "Turn editing off"; $string['turneditingon'] = "Turn editing on"; -$string['total'] = "Total"; $string['undecided'] = "Undecided"; $string['unenrol'] = "Unenrol"; $string['unenrolme'] = "Unenrol me from \$a"; diff --git a/lib/datalib.php b/lib/datalib.php index 25546877641..06e5d169276 100644 --- a/lib/datalib.php +++ b/lib/datalib.php @@ -83,6 +83,9 @@ function table_column($table, $oldfield, $field, $type="integer", $size="10", case "mysqlt": switch (strtolower($type)) { + case "text": + $type = "TEXT"; + break; case "integer": $type = "INTEGER($size)"; break; @@ -821,16 +824,24 @@ function get_site () { function get_courses($category=0, $sort="fullname ASC") { -/// Returns list of courses +/// Returns list of courses, for whole site, or category - if ($category > 0) { // Return all courses in one category - $courses = get_records("course", "category", $category, $sort); + if ($category === 0) { // Return all courses, except site + $courses = get_records_select("course", "category > 0", $sort); - } else if ($category < 0) { // Return all courses, even the site + } else if ($category === -1) { // Return all courses, even the site $courses = get_records("course", "", "", $sort); - } else { // Return all courses, except site - $courses = get_records_select("course", "category > 0", $sort); + } else { // $category is an object + $courses = get_records("course", "category", $category->id); + if ($courses) { // Reorder them + $courselist = explode(',', $category->courseorder); + $outcourses = array(); + foreach ($courselist as $courseid) { + $outcourses[] = $courses[$courseid]; + } + $courses = $outcourses; + } } if ($courses) { /// Remove unavailable courses from the list @@ -845,8 +856,37 @@ function get_courses($category=0, $sort="fullname ASC") { return $courses; } -function get_categories() { - return get_records("course_categories", "", "", "name"); +function get_my_courses($userid, $sort="c.fullname ASC") { + global $CFG; + + return get_records_sql("SELECT c.* + FROM {$CFG->prefix}course c, + {$CFG->prefix}user_students s, + {$CFG->prefix}user_teachers t + WHERE (s.userid = '$userid' AND s.course = c.id) + OR (t.userid = '$userid' AND t.course = c.id) + GROUP BY c.id + ORDER BY $sort"); +} + + +function get_categories($parent="none", $sort="sortorder ASC") { + if ($parent == "none") { + $categories = get_records("course_categories", "", "", $sort); + } else { + $categories = get_records("course_categories", "parent", $parent, $sort); + } + if ($categories) { /// Remove unavailable categories from the list + $admin = isadmin(); + foreach ($categories as $key => $category) { + if (!$category->visible) { + if (!$admin) { + unset($categories[$key]); + } + } + } + } + return $categories; } diff --git a/lib/db/mysql.php b/lib/db/mysql.php index 33ea8caaf53..a2058df9b6c 100644 --- a/lib/db/mysql.php +++ b/lib/db/mysql.php @@ -413,6 +413,15 @@ function main_upgrade($oldversion=0) { execute_sql(" ALTER TABLE `{$CFG->prefix}user_teachers` ADD INDEX courseuserid (course,userid) "); } + if ($oldversion < 2003072803) { + table_column("course_categories", "", "description", "text", "", "", ""); + table_column("course_categories", "", "parent", "integer", "10", "unsigned"); + table_column("course_categories", "", "sortorder", "integer", "10", "unsigned"); + table_column("course_categories", "", "courseorder", "text", "", "", ""); + table_column("course_categories", "", "visible", "integer", "1", "unsigned", "1"); + table_column("course_categories", "", "timemodified", "integer", "10", "unsigned"); + } + return $result; } diff --git a/lib/db/mysql.sql b/lib/db/mysql.sql index ece942f6f2b..66c0a33bd81 100644 --- a/lib/db/mysql.sql +++ b/lib/db/mysql.sql @@ -60,6 +60,12 @@ CREATE TABLE `prefix_course` ( CREATE TABLE `prefix_course_categories` ( `id` int(10) unsigned NOT NULL auto_increment, `name` varchar(255) NOT NULL default '', + `description` text NOT NULL, + `parent` int(10) unsigned NOT NULL default '0', + `sortorder` int(10) unsigned NOT NULL default '0', + `courseorder` text NOT NULL, + `visible` tinyint(1) NOT NULL default '1', + `timemodified` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`) ) TYPE=MyISAM COMMENT='Course categories'; diff --git a/lib/db/postgres7.php b/lib/db/postgres7.php index 653423fef67..8e3c95986c5 100644 --- a/lib/db/postgres7.php +++ b/lib/db/postgres7.php @@ -184,6 +184,15 @@ function main_upgrade($oldversion=0) { execute_sql(" CREATE INDEX {$CFG->prefix}user_teachers_courseuserid_idx ON {$CFG->prefix}user_teachers (course,userid) "); } + if ($oldversion < 2003072802) { + table_column("course_categories", "", "description", "text", "", "", ""); + table_column("course_categories", "", "parent", "integer", "10", "unsigned"); + table_column("course_categories", "", "sortorder", "integer", "10", "unsigned"); + table_column("course_categories", "", "courseorder", "text", "", "", ""); + table_column("course_categories", "", "visible", "integer", "1", "unsigned", "1"); + table_column("course_categories", "", "timemodified", "integer", "10", "unsigned"); + } + return $result; } ?> diff --git a/lib/db/postgres7.sql b/lib/db/postgres7.sql index 4f689cd567b..3a8630f108d 100644 --- a/lib/db/postgres7.sql +++ b/lib/db/postgres7.sql @@ -31,6 +31,12 @@ CREATE TABLE prefix_course ( CREATE TABLE prefix_course_categories ( id SERIAL PRIMARY KEY, name varchar(255) NOT NULL default '' + description text NOT NULL default '', + parent integer NOT NULL default '0', + sortorder integer NOT NULL default '0', + courseorder text NOT NULL default '', + visible integer NOT NULL default '1', + timemodified` integer NOT NULL default '0' ); CREATE TABLE prefix_course_display ( diff --git a/lib/weblib.php b/lib/weblib.php index f00c7e86fe5..0121cd3dbbb 100644 --- a/lib/weblib.php +++ b/lib/weblib.php @@ -725,7 +725,7 @@ function print_footer ($course=NULL) { $homelink = "framename}\" href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname"; } } else { - $homelink = "framename}\" href=\"$CFG->wwwroot\">".get_string("home").""; + $homelink = "framename}\" href=\"$CFG->wwwroot/\">".get_string("home").""; $course = get_site(); } @@ -1079,6 +1079,17 @@ function update_module_button($moduleid, $courseid, $string) { } } +function update_category_button($categoryid) { +// Prints the editing button on a module "view" page + global $CFG; + + if (isadmin()) { + $string = get_string("editthiscategory"); + return "wwwroot/course/category.php\">". + "". + ""; + } +} function navmenu($course, $cm=NULL) { // Given a course and a (current) coursemodule @@ -1184,7 +1195,7 @@ function error ($message, $link="") { $link = "$SESSION->fromurl"; unset($SESSION->fromurl); } else { - $link = "$CFG->wwwroot"; + $link = "$CFG->wwwroot/"; } } print_continue($link); @@ -1245,7 +1256,7 @@ function notice ($message, $link="") { if (!empty($_SERVER["HTTP_REFERER"])) { $link = $_SERVER["HTTP_REFERER"]; } else { - $link = $CFG->wwwroot; + $link = "$CFG->wwwroot/"; } } diff --git a/version.php b/version.php index abe5209d524..87c589dcff9 100644 --- a/version.php +++ b/version.php @@ -5,7 +5,7 @@ // database to determine whether upgrades should // be performed (see lib/db/*.php) -$version = 2003072800; // The current version is a date (YYYYMMDDXX) +$version = 2003072803; // The current version is a date (YYYYMMDDXX) $release = "1.1 development"; // User-friendly version number
"; - print_course_categories($categories, $category, 200); - echo ""; +/// Print the category selector + + $categories = get_categories(); + $multicategories = count($categories) > 1; + + if (count($categories) > 1) { + $parentlist = array(); + $displaylist = array(); + $displaylist["0"] = $strfulllistofcourses; + make_categories_list($displaylist, $parentlist, ""); + + echo "
"; + popup_form("index.php?category=", $displaylist, "switchcategory", "$category->id", "", "", "", false); + echo "

"; + } + + if (empty($category->id)) { + print_courses(0, "80%"); } else { - echo "
"; - $category="all"; - unset($title); + print_courses($category, "80%"); } - if ($category) { - if (isset($title)) { - print_heading_block($title); - } - echo "
"; - print_all_courses($category); - } - - echo "
"; - print_footer(); ?> diff --git a/course/lib.php b/course/lib.php index 9a7c9733c34..fc1f9fada7c 100644 --- a/course/lib.php +++ b/course/lib.php @@ -14,6 +14,9 @@ define('COURSE_LIVELOG_REFRESH', 60); // Seconds define('COURSE_MAX_RECENT_PERIOD', 604800); // A week, in seconds +define("FRONTPAGENEWS", 0); +define("FRONTPAGECOURSELIST", 1); +define("FRONTPAGECATEGORYNAMES", 2); function print_log_selector_form($course, $selecteduser=0, $selecteddate="today") { @@ -189,114 +192,16 @@ function print_log($course, $user=0, $date=0, $order="ORDER BY l.time ASC") { } -function print_all_courses($category="all", $style="full", $maxcount=999, $width=180) { - global $CFG, $THEME, $USER; - - if ($category == "all") { - $courses = get_courses(); - - } else if ($category == "my") { - if (isset($USER->id)) { - if ($courses = get_courses()) { - foreach ($courses as $key => $course) { - if (!isteacher($course->id) and !isstudent($course->id)) { - unset($courses[$key]); - } - } - } - } - +function print_log_graph($course, $userid=0, $type="course.png", $date=0) { + global $CFG; + if (empty($CFG->gdversion)) { + echo "(".get_string("gdneed").")"; } else { - $courses = get_courses($category); - } - - if ($style == "minimal") { - $count = 0; - if (empty($THEME->custompix)) { - $icon = "wwwroot/pix/i/course.gif\" height=16 width=16 alt=\"".get_string("course")."\">"; - } else { - $icon = "wwwroot/theme/$CFG->theme/pix/i/course.gif\" height=16 width=16 alt=\"".get_string("course")."\">"; - } - if ($courses) { - foreach ($courses as $course) { - $moddata[]="shortname\" href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname"; - $modicon[]=$icon; - if ($count++ >= $maxcount) { - break; - } - } - $fulllist = "

wwwroot/course/\">".get_string("fulllistofcourses")."..."; - } else { - $moddata = array(); - $modicon = array(); - $fulllist = get_string("nocoursesyet"); - } - print_side_block(get_string("courses"), "", $moddata, $modicon, $fulllist, $width); - - } else if ($courses) { - foreach ($courses as $course) { - print_course($course); - echo "
\n"; - } - - } else { - echo "

".get_string("nocoursesyet")."

"; + echo "wwwroot/course/loggraph.php?id=$course->id&user=$userid&type=$type&date=$date\">"; } } -function print_course($course) { - - global $CFG, $THEME; - - if (! $site = get_site()) { - error("Could not find a site!"); - } - - if (empty($THEME->custompix)) { - $pixpath = "$CFG->wwwroot/pix"; - } else { - $pixpath = "$CFG->wwwroot/theme/$CFG->theme/pix"; - } - - print_simple_box_start("CENTER", "100%"); - - echo ""; - echo ""; - echo ""; - echo "
"; - echo "

wwwroot/course/view.php?id=$course->id\">$course->fullname

"; - if ($teachers = get_course_teachers($course->id)) { - echo "

\n"; - foreach ($teachers as $teacher) { - if ($teacher->authority > 0) { - if (!$teacher->role) { - $teacher->role = $course->teacher; - } - echo "$teacher->role: wwwroot/user/view.php?id=$teacher->id&course=$site->id\">$teacher->firstname $teacher->lastname
"; - } - } - echo "

"; - } - if ($course->guest) { - $strallowguests = get_string("allowguests"); - echo "wwwroot/course/view.php?id=$course->id\">"; - echo "\"$strallowguests\"  "; - } - if ($course->password) { - $strrequireskey = get_string("requireskey"); - echo "wwwroot/course/view.php?id=$course->id\">"; - echo "\"$strrequireskey\""; - } - - - echo "
"; - echo "

".text_to_html($course->summary)."

"; - echo "
"; - - print_simple_box_end(); -} function print_recent_activity($course) { // $course is an object @@ -593,7 +498,7 @@ function print_section_block($heading, $course, $section, $mods, $modnames, $mod } if ($mod->visible or $isteacher) { $instancename = urldecode($modinfo[$modnumber]->name); - $link_css = $mod->visible ? "" : " class=\"dimmed\" "; + $linkcss = $mod->visible ? "" : " class=\"dimmed\" "; if (!empty($modinfo[$modnumber]->extra)) { $extra = urldecode($modinfo[$modnumber]->extra); } else { @@ -602,7 +507,7 @@ function print_section_block($heading, $course, $section, $mods, $modnames, $mod $modicon[] = "wwwroot/mod/$mod->modname/icon.gif\"". " height=\"16\" width=\"16\" alt=\"$mod->modfullname\">"; - $moddata[] = "modfullname\" $link_css $extra". + $moddata[] = "modfullname\" $linkcss $extra". "href=\"$CFG->wwwroot/mod/$mod->modname/view.php?id=$mod->id\">$instancename". "
$editbuttons"; } @@ -670,10 +575,10 @@ function print_section($course, $section, $mods, $modnamesused, $absolute=false, } else { $extra = ""; } - $link_css = $mod->visible ? "" : " class=\"dimmed\" "; + $linkcss = $mod->visible ? "" : " class=\"dimmed\" "; echo "wwwroot/mod/$mod->modname/icon.gif\"". " height=16 width=16 alt=\"$mod->modfullname\">". - " modfullname\" $link_css $extra". + " modfullname\" $linkcss $extra". " href=\"$CFG->wwwroot/mod/$mod->modname/view.php?id=$mod->id\">$instancename"; } if (isediting($course->id)) { @@ -893,9 +798,127 @@ function print_course_admin_links($course, $width=180) { print_side_block(get_string("administration"), "", $admindata, $adminicon, "", $width); } -function print_course_categories($categories, $selected="none", $width=180) { - global $CFG, $THEME, $USER; - + +function make_categories_list(&$list, &$parents, $category=NULL, $path="") { +/// Given an empty array, this function recursively travels the +/// categories, building up a nice list for display. It also makes +/// an array that list all the parents for each category. + + if ($category) { + if ($path) { + $path = "$path / $category->name"; + } else { + $path = "$category->name"; + } + $list[$category->id] = $path; + } else { + $category->id = 0; + } + + if ($categories = get_categories("$category->id")) { // Print all the children recursively + foreach ($categories as $cat) { + if (!empty($category->id)) { + $parents[$cat->id] = $parents[$category->id]; + $parents[$cat->id][] = $category->id; + } + make_categories_list($list, &$parents, $cat, $path); + } + } +} + + +function fix_category_courses($categoryid) { +/// Given a category, this function makes sure the courseorder +/// variable reflects the real world. + + if (!$category = get_record("course_categories", "id", $categoryid)) { + return false; + } + + $catcourseschanged = false; + + if (trim($category->courseorder)) { + $catcourses = explode(',', $category->courseorder); + } else { + $catcourses = array(); + } + $courses = get_records("course", "category", $category->id); + + if ($catcourses) { + foreach ($catcourses as $key => $catcourse) { // Look for missing courses + if (!isset($courses[$catcourse])) { + $catcourseschanged = true; + unset($catcourses[$key]); + } + } + } + if ($courses) { + foreach ($courses as $course) { + if (!in_array($course->id, $catcourses)) { + $catcourseschanged = true; + $catcourses[] = $course->id; + } + } + } + if ($catcourseschanged) { + $category->courseorder = implode(',', $catcourses); + return set_field("course_categories", "courseorder", $category->courseorder, "id", $category->id); + } + return true; +} + + + +function print_whole_category_list($category=NULL, $displaylist=NULL, $parentslist=NULL, $depth=-1) { +/// Recursive function to print out all the categories in a nice format +/// with or without courses included + + if (!$displaylist) { + make_categories_list(&$displaylist, &$parentslist); + } + + if ($category) { + if ($category->visible or isadmin()) { + print_category_box($category, $depth); + } else { + return; // Don't bother printing children of invisible categories + } + + } else { + print_simple_box_start("center", "100%"); + $category->id = "0"; + } + + if ($categories = get_categories($category->id)) { // Print all the children recursively + $countcats = count($categories); + $count = 0; + $first = true; + $last = false; + foreach ($categories as $cat) { + $count++; + if ($count == $countcats) { + $last = true; + } + $up = $first ? false : true; + $down = $last ? false : true; + $first = false; + + print_whole_category_list($cat, $displaylist, $parentslist, $depth + 1); + } + } + + if ($category->id == "0") { + print_simple_box_end(); + } +} + + + +function print_category_box($category, $depth) { +/// Prints the category box in indented fashion + + global $CFG; + $strallowguests = get_string("allowguests"); $strrequireskey = get_string("requireskey"); @@ -905,84 +928,189 @@ function print_course_categories($categories, $selected="none", $width=180) { $pixpath = "$CFG->wwwroot/theme/$CFG->theme/pix"; } - if ($selected == "index") { // Print comprehensive index of categories with courses - if ($courses = get_courses()) { - if (isset($USER->id) and !isadmin()) { - print_simple_box_start("CENTER", "100%", $THEME->cellheading); - print_heading("".get_string("mycourses")."", "left"); - $some = false; - echo ""; - print_simple_box_end(); - print_spacer(8,1); - } - foreach ($categories as $category) { - print_simple_box_start("CENTER", "100%"); - print_heading("id\">$category->name", "left"); - $some = false; - echo ""; - print_simple_box_end(); - print_spacer(8,1); - } - } + $size = $depth * 40; - } else { // Print short list of categories only - foreach ($categories as $cat) { - $caticon[]=""; - if ($cat->id == $selected) { - $catdata[]="$cat->name"; - } else { - $catdata[]="wwwroot/course/index.php?category=$cat->id\">$cat->name"; + $catlinkcss = $category->visible ? "" : " class=\"dimmed\" "; + + echo ""; + echo ""; + echo ""; + echo ""; + echo "
"; + echo print_spacer(1, $size); + echo ""; + echo "wwwroot/course/index.php?category=$category->id\">$category->name"; + //echo "$category->name"; + if ($CFG->frontpage == FRONTPAGECOURSELIST) { + if ($courses = get_courses($category)) { + echo ""; } - $catdata[] = "wwwroot/course/index.php?category=all\">".get_string("fulllistofcourses").""; - $caticon[] = ""; - if (isset($USER->id)) { - $catdata[] = "wwwroot/course/index.php?category=my\">".get_string("mycourses").""; - $caticon[] = ""; - } - print_side_block(get_string("categories"), "", $catdata, $caticon, "", $width); } + echo "
"; + } -function print_log_graph($course, $userid=0, $type="course.png", $date=0) { - global $CFG; - if (empty($CFG->gdversion)) { - echo "(".get_string("gdneed").")"; +function print_courses_sideblock($category=0, $width="100%") { + global $CFG, $THEME; + + if (empty($THEME->custompix)) { + $icon = "wwwroot/pix/i/course.gif\"". + " height=\"16\" width=\"16\" alt=\"".get_string("course")."\">"; } else { - echo "wwwroot/course/loggraph.php?id=$course->id&user=$userid&type=$type&date=$date\">"; + $icon = "wwwroot/theme/$CFG->theme/pix/i/course.gif\"". + " height=\"16\" width=\"16\" alt=\"".get_string("course")."\">"; } + + $categories = get_categories(0); // Parent = 0 ie top-level categories only + if (count($categories) > 1) { // Just print top level category links + foreach ($categories as $category) { + $linkcss = $category->visible ? "" : " class=\"dimmed\" "; + $moddata[]="wwwroot/course/index.php?category=$category->id\">$category->name"; + $modicon[]=$icon; + } + } else { // Just print course names of single category + $courses = get_courses($category); + if ($courses) { + foreach ($courses as $course) { + $linkcss = $course->visible ? "" : " class=\"dimmed\" "; + $moddata[]="shortname\" ". + "href=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname"; + $modicon[]=$icon; + } + $fulllist = "

wwwroot/course/\">".get_string("fulllistofcourses")."..."; + } else { + $moddata = array(); + $modicon = array(); + $fulllist = get_string("nocoursesyet"); + } + } + + print_side_block(get_string("courses"), "", $moddata, $modicon, $fulllist, $width); +} + + +function print_courses($category, $width="100%") { +/// Category is 0 (for all courses) or an object + + global $CFG, $THEME; + + if (empty($category)) { + $categories = NULL; + $courses = get_courses(0); + } else { + $categories = get_categories($category->id); // sub categories + $courses = get_courses($category); + } + + if ($categories) { + print_simple_box_start("center"); + print_heading(get_string("subcategories")); + foreach ($categories as $category) { + $linkcss = $category->visible ? "" : " class=\"dimmed\" "; + echo "

wwwroot/course/index.php?category=$category->id\">$category->name

"; + } + print_simple_box_end(); + } + + if ($courses) { + foreach ($courses as $course) { + print_course($course, $width); + echo "
\n"; + } + } else { + print_heading(get_string("nocoursesyet")); + } + +} + + +function print_course($course, $width="100%") { + + global $CFG, $THEME; + + if (! $site = get_site()) { + error("Could not find a site!"); + } + + if (empty($THEME->custompix)) { + $pixpath = "$CFG->wwwroot/pix"; + } else { + $pixpath = "$CFG->wwwroot/theme/$CFG->theme/pix"; + } + + print_simple_box_start("center", "$width"); + + echo ""; + echo ""; + echo ""; + echo "
"; + echo "

wwwroot/course/view.php?id=$course->id\">$course->fullname

"; + if ($teachers = get_course_teachers($course->id)) { + echo "

\n"; + foreach ($teachers as $teacher) { + if ($teacher->authority > 0) { + if (!$teacher->role) { + $teacher->role = $course->teacher; + } + echo "$teacher->role: wwwroot/user/view.php?id=$teacher->id&course=$site->id\">$teacher->firstname $teacher->lastname
"; + } + } + echo "

"; + } + if ($course->guest) { + $strallowguests = get_string("allowguests"); + echo "wwwroot/course/view.php?id=$course->id\">"; + echo "\"$strallowguests\"  "; + } + if ($course->password) { + $strrequireskey = get_string("requireskey"); + echo "wwwroot/course/view.php?id=$course->id\">"; + echo "\"$strrequireskey\""; + } + + + echo "
"; + echo "

".text_to_html($course->summary)."

"; + echo "
"; + + print_simple_box_end(); +} + + +function print_my_moodle() { +/// Prints custom user information on the home page. +/// Over time this can include all sorts of information + + global $USER, $CFG; + + if (!isset($USER->id)) { + error("It shouldn't be possible to see My Moodle without being logged in."); + } + + if ($courses = get_my_courses($USER->id)) { + foreach ($courses as $course) { + print_course($course, "100%"); + echo "
\n"; + } + } + echo "

wwwroot/course/\">".get_string("fulllistofcourses")."...

"; } diff --git a/course/unenrol.php b/course/unenrol.php index 3c32377dd47..d9eb241244a 100644 --- a/course/unenrol.php +++ b/course/unenrol.php @@ -34,7 +34,7 @@ if ($user->id == $USER->id) { unset($USER->student["$id"]); - redirect("$CFG->wwwroot"); + redirect("$CFG->wwwroot/"); } redirect("$CFG->wwwroot/user/index.php?id=$course->id"); diff --git a/index.php b/index.php index ed7a34dc509..f48298d1476 100644 --- a/index.php +++ b/index.php @@ -61,14 +61,23 @@ echo "
"; } - if ($site->newsitems > 0 ) { - $categories = get_categories(); - if (count($categories) > 1) { - print_course_categories($categories, "none", $side); - } else { - $category = array_shift($categories); - print_all_courses($category->id, "minimal", 10, $side); - } + switch ($CFG->frontpage) { + case FRONTPAGENEWS: // print news links on the side + print_courses_sideblock(0, "$side"); + break; + + case FRONTPAGECOURSELIST: + case FRONTPAGECATEGORYNAMES: + if ($site->newsitems) { + if ($news = forum_get_course_forum($site->id, "news")) { + print_side_block_start(get_string("latestnews"), $side, "sideblocklatestnews"); + echo ""; + forum_print_latest_discussions($news->id, $site->newsitems, "minimal", "", false); + echo ""; + print_side_block_end(); + } + } + break; } print_spacer(1,$side); } @@ -86,38 +95,49 @@ } echo "
"; - if ($site->newsitems == 0 ) { - print_heading_block(get_string("availablecourses")); - print_spacer(8,1); - $categories = get_categories(); - if (count($categories) > 1) { - print_course_categories($categories, "index"); - } else { - print_all_courses("all"); - } - - } else { - if (! $newsforum = forum_get_course_forum($site->id, "news")) { - error("Could not find or create a main news forum for the site"); - } - - if (isset($USER->id)) { - $SESSION->fromdiscussion = "$CFG->wwwroot"; - if (forum_is_subscribed($USER->id, $newsforum->id)) { - $subtext = get_string("unsubscribe", "forum"); - } else { - $subtext = get_string("subscribe", "forum"); + switch ($CFG->frontpage) { /// Display the main part of the front page. + case FRONTPAGENEWS: + if (! $newsforum = forum_get_course_forum($site->id, "news")) { + error("Could not find or create a main news forum for the site"); } - $headertext = " -
- id\">$subtext -
$newsforum->name"; - } else { - $headertext = $newsforum->name; - } - print_heading_block($headertext); - print_spacer(8,1); - forum_print_latest_discussions($newsforum->id, $site->newsitems); + + if (isset($USER->id)) { + $SESSION->fromdiscussion = "$CFG->wwwroot"; + if (forum_is_subscribed($USER->id, $newsforum->id)) { + $subtext = get_string("unsubscribe", "forum"); + } else { + $subtext = get_string("subscribe", "forum"); + } + $headertext = " + +
$newsforum->name + id\">$subtext +
"; + } else { + $headertext = $newsforum->name; + } + print_heading_block($headertext); + print_spacer(8,1); + forum_print_latest_discussions($newsforum->id, $site->newsitems); + break; + + case FRONTPAGECOURSELIST: + case FRONTPAGECATEGORYNAMES: + if (isset($USER->id) and !isset($USER->admin)) { + print_heading_block(get_string("mycourses")); + print_spacer(8,1); + print_my_moodle(); + } else { + print_heading_block(get_string("availablecourses")); + print_spacer(8,1); + if (count_records("course_categories") > 1) { + print_whole_category_list(); + } else { + print_courses(0, "100%"); + } + } + break; + } echo "