<?php //$Id$
require_once($CFG->libdir.'/formslib.php');
+require_once($CFG->libdir.'/questionlib.php');
class delete_category_form extends moodleform {
var $_category;
function definition() {
- global $CFG;
+ global $CFG, $DB;
$mform =& $this->_form;
$category = $this->_customdata;
ensure_context_subobj_present($category, CONTEXT_COURSECAT);
$this->_category = $category;
- $mform->addElement('header','general', get_string('categorycurrentcontents', '', format_string($category->name)));
-
- $displaylist = array();
- $notused = array();
- make_categories_list($displaylist, $notused, 'moodle/course:create', $category->id);
-
- // Check permissions, to see if it OK to give the option to delete
- // the contents, rather than move elsewhere.
+ /// Check permissions, to see if it OK to give the option to delete
+ /// the contents, rather than move elsewhere.
+ /// Are there any subcategories of this one, can they be deleted?
$candeletecontent = true;
- $tocheck = array($category);
+ $tocheck = get_child_categories($category->id);
+ $containscategories = !empty($tocheck);
+ $categoryids = array($category->id);
while (!empty($tocheck)) {
$checkcat = array_pop($tocheck);
+ $childcategoryids[] = $checkcat->id;
$tocheck = $tocheck + get_child_categories($checkcat->id);
- if (!has_capability('moodle/category:manage', $checkcat->context)) {
+ if ($candeletecontent && !has_capability('moodle/category:manage', $checkcat->context)) {
$candeletecontent = false;
- break;
}
}
- // TODO check that the user is allowed to delete all the courses MDL-17502!
+ /// Are there any courses in here, can they be deleted?
+ list($test, $params) = $DB->get_in_or_equal($categoryids);
+ $containedcourses = $DB->get_records_sql(
+ "SELECT id,1 FROM {course} c WHERE c.category $test", $params);
+ $containscourses = false;
+ if ($containedcourses) {
+ $containscourses = true;
+ foreach ($containedcourses as $courseid => $notused) {
+ if ($candeletecontent && !can_delete_course($courseid)) {
+ $candeletecontent = false;
+ break;
+ }
+ }
+ }
- $options = array();
+ /// Are there any questions in the question bank here?
+ $containsquestions = question_context_has_any_questions($category->context);
- if ($displaylist) {
- $options[0] = get_string('move');
+ /// Get the list of categories we might be able to move to.
+ $testcaps = array();
+ if ($containscourses) {
+ $testcaps[] = 'moodle/course:create';
+ }
+ if ($containscategories || $containsquestions) {
+ $testcaps[] = 'moodle/category:manage';
+ }
+ $displaylist = array();
+ $notused = array();
+ if (!empty($testcaps)) {
+ make_categories_list($displaylist, $notused, $testcaps, $category->id);
}
+ /// Now build the options.
+ $options = array();
+ if ($displaylist) {
+ $options[0] = get_string('movecontentstoanothercategory');
+ }
if ($candeletecontent) {
- $options[1] = get_string('delete');
+ $options[1] = get_string('deleteallcannotundo');
}
- if (empty($options)) {
- print_error('nocategorydelete', 'error', 'index.php', format_string($category->name));
- }
+ /// Now build the form.
+ $mform->addElement('header','general', get_string('categorycurrentcontents', '', format_string($category->name)));
- $mform->addElement('select', 'fulldelete', get_string('categorycontents'), $options);
- $mform->disabledIf('newparent', 'fulldelete', 'eq', '1');
- $mform->setDefault('newparent', 0);
+ if ($containscourses || $containscategories || $containsquestions) {
+ if (empty($options)) {
+ print_error('youcannotdeletecategory', 'error', 'index.php', format_string($category->name));
+ }
- if ($displaylist) {
- $mform->addElement('select', 'newparent', get_string('movecategorycontentto'), $displaylist);
- if (in_array($category->parent, $displaylist)) {
- $mform->setDefault('newparent', $category->parent);
+ /// Describe the contents of this category.
+ $contents = '<ul>';
+ if ($containscategories) {
+ $contents .= '<li>' . get_string('subcategories') . '</li>';
+ }
+ if ($containscourses) {
+ $contents .= '<li>' . get_string('courses') . '</li>';
}
+ if ($containsquestions) {
+ $contents .= '<li>' . get_string('questionsinthequestionbank') . '</li>';
+ }
+ $contents .= '</ul>';
+ $mform->addElement('static', 'emptymessage', get_string('thiscategorycontains'), $contents);
+
+ /// Give the options for what to do.
+ $mform->addElement('select', 'fulldelete', get_string('whattodo'), $options);
+ if (count($options) == 1) {
+ $mform->hardFreeze('fulldelete');
+ $mform->setConstant('fulldelete', reset(array_keys($options)));
+ }
+
+ if ($displaylist) {
+ $mform->addElement('select', 'newparent', get_string('movecategorycontentto'), $displaylist);
+ if (in_array($category->parent, $displaylist)) {
+ $mform->setDefault('newparent', $category->parent);
+ }
+ $mform->disabledIf('newparent', 'fulldelete', 'eq', '1');
+ }
+ } else {
+ $mform->addElement('hidden', 'fulldelete', 1);
+ $mform->addElement('static', 'emptymessage', '', get_string('deletecategoryempty'));
}
$mform->addElement('hidden', 'delete');
function validation($data, $files) {
$errors = parent::validation($data, $files);
- if (!empty($data['fulldelete'])) {
- // already verified
- } else {
- if (empty($data['newparent'])) {
- $errors['newparent'] = get_string('required');
- }
+ if (empty($data['fulldelete']) && empty($data['newparent'])) {
+ /// When they have chosen the move option, they must specify a destination.
+ $errors['newparent'] = get_string('required');
}
if ($data['sure'] != md5(serialize($this->_category))) {
$string['defaultcourseteachers'] = 'Teachers';
$string['delete'] = 'Delete';
$string['deleteall'] = 'Delete all';
+$string['deleteallcannotundo'] = 'Delete all - cannot be undone';
$string['deleteallcomments'] = 'Delete all comments';
$string['deleteallratings'] = 'Delete all ratings';
$string['deletecategory'] = 'Delete category: $a';
$string['deletecategorycheck'] = 'Are you absolutely sure you want to completely delete this category <b>\'$a\'</b>?<br />This will move all courses into the parent category if there is one, or into Miscellaneous.';
$string['deletecategorycheck2'] = 'If you delete this category, you need to choose what to do with the courses and subcategories it contains.';
+$string['deletecategoryempty'] = 'This category is empty.';
$string['deletecheck'] = 'Delete $a ?';
$string['deletecheckfiles'] = 'Are you absolutely sure you want to delete these files?';
$string['deletecheckfull'] = 'Are you absolutely sure you want to completely delete $a ?';
$string['move'] = 'Move';
$string['movecategoryto'] = 'Move category to:';
$string['movecategorycontentto'] = 'Move into';
+$string['movecontentstoanothercategory'] = 'Move contents to another category';
$string['movecourseto'] = 'Move course to:';
$string['movedown'] = 'Move down';
$string['movefilestohere'] = 'Move files to here';
$string['publicdirectorytitle'] = 'See the current list of sites';
$string['publicsitefileswarning'] = 'Note: files placed here can be accessed by anyone';
$string['question'] = 'Question';
+$string['questionsinthequestionbank'] = 'Questions in the question bank';
$string['readinginfofrombackup'] = 'Reading info from backup';
$string['readme'] = 'README';
$string['recentactivity'] = 'Recent Activity';
$string['themes'] = 'Themes';
$string['themesaved'] = 'New theme saved';
$string['thereareno'] = 'There are no $a in this course';
+$string['thiscategorycontains'] = 'This category contains';
$string['thischarset'] = 'UTF-8';
$string['thisdirection'] = 'ltr';
$string['thislanguage'] = 'English';
$a->profileurl';
$string['whattocallzip'] = 'What do you want to call the zip file?';
+$string['whattodo'] = 'What to do';
$string['withchosenfiles'] = 'With chosen files';
$string['withoutuserdata'] = 'without user data';
$string['withselectedusers'] = 'With selected users...';