$data = (object)$data;
- if (!empty($CFG->usetags)) { // if enabled in server
- // TODO: This is highly inneficient. Each time we add one tag
- // we fetch all the existing because tag_set() deletes them
- // so everything must be reinserted on each call
- $tags = array();
- $existingtags = tag_get_tags('course', $this->get_courseid());
- // Re-add all the existitng tags
- foreach ($existingtags as $existingtag) {
- $tags[] = $existingtag->rawname;
- }
- // Add the one being restored
- $tags[] = $data->rawname;
- // Send all the tags back to the course
- tag_set('course', $this->get_courseid(), $tags, 'core',
- context_course::instance($this->get_courseid())->id);
- }
+ core_tag_tag::add_item_tag('core', 'course', $this->get_courseid(),
+ context_course::instance($this->get_courseid()), $data->rawname);
}
public function process_allowed_module($data) {
}
// Populate course tags.
- if (!empty($CFG->usetags)) {
- include_once($CFG->dirroot.'/tag/lib.php');
- $course->tags = tag_get_tags_array('course', $course->id);
- }
+ $course->tags = core_tag_tag::get_item_tags_array('core', 'course', $course->id);
} else {
// Editor should respect category context if course context is not set.
}
}
- if (!empty($CFG->usetags) &&
+ if (core_tag_tag::is_enabled('core', 'course') &&
((empty($course->id) && guess_if_creator_will_have_course_capability('moodle/course:tag', $categorycontext))
|| (!empty($course->id) && has_capability('moodle/course:tag', $coursecontext)))) {
$mform->addElement('header', 'tagshdr', get_string('tags', 'tag'));
- $mform->addElement('tags', 'tags', get_string('tags'));
+ $mform->addElement('tags', 'tags', get_string('tags'),
+ array('itemtype' => 'course', 'component' => 'core'));
}
// When two elements we need a group.
'criteriatype' => COMPLETION_CRITERIA_TYPE_ACTIVITY));
// Delete all tag instances associated with the instance of this module.
- core_tag::delete_instances('mod_' . $modulename, null, $modcontext->id);
+ core_tag_tag::delete_instances('mod_' . $modulename, null, $modcontext->id);
// Delete the context.
context_helper::delete_instance(CONTEXT_MODULE, $cm->id);
*/
function create_course($data, $editoroptions = NULL) {
global $DB, $CFG;
- require_once($CFG->dirroot.'/tag/lib.php');
//check the categoryid - must be given for all new courses
$category = $DB->get_record('course_categories', array('id'=>$data->category), '*', MUST_EXIST);
enrol_course_updated(true, $course, $data);
// Update course tags.
- if ($CFG->usetags && isset($data->tags)) {
- tag_set('course', $course->id, $data->tags, 'core', context_course::instance($course->id)->id);
+ if (isset($data->tags)) {
+ core_tag_tag::set_item_tags('core', 'course', $course->id, context_course::instance($course->id), $data->tags);
}
return $course;
*/
function update_course($data, $editoroptions = NULL) {
global $DB, $CFG;
- require_once($CFG->dirroot.'/tag/lib.php');
$data->timemodified = time();
enrol_course_updated(false, $course, $data);
// Update course tags.
- if ($CFG->usetags && isset($data->tags)) {
- tag_set('course', $course->id, $data->tags, 'core', context_course::instance($course->id)->id);
+ if (isset($data->tags)) {
+ core_tag_tag::set_item_tags('core', 'course', $course->id, context_course::instance($course->id), $data->tags);
}
// Trigger a course updated event.
$event = \core\event\course_viewed::create($eventdata);
$event->trigger();
}
+
+/**
+ * Returns courses tagged with a specified tag.
+ *
+ * @param core_tag_tag $tag
+ * @param bool $exclusivemode if set to true it means that no other entities tagged with this tag
+ * are displayed on the page and the per-page limit may be bigger
+ * @param int $fromctx context id where the link was displayed, may be used by callbacks
+ * to display items in the same context first
+ * @param int $ctx context id where to search for records
+ * @param bool $rec search in subcontexts as well
+ * @param int $page 0-based number of page being displayed
+ * @return \core_tag\output\tagindex
+ */
+function course_get_tagged_courses($tag, $exclusivemode = false, $fromctx = 0, $ctx = 0, $rec = 1, $page = 0) {
+ global $CFG, $PAGE;
+ require_once($CFG->libdir . '/coursecatlib.php');
+
+ $perpage = $exclusivemode ? $CFG->coursesperpage : 5;
+ $displayoptions = array(
+ 'limit' => $perpage,
+ 'offset' => $page * $perpage,
+ 'viewmoreurl' => null,
+ );
+
+ $courserenderer = $PAGE->get_renderer('core', 'course');
+ $totalcount = coursecat::search_courses_count(array('tagid' => $tag->id, 'ctx' => $ctx, 'rec' => $rec));
+ $content = $courserenderer->tagged_courses($tag->id, $exclusivemode, $ctx, $rec, $displayoptions);
+ $totalpages = ceil($totalcount / $perpage);
+
+ return new core_tag\output\tagindex($tag, 'core', 'course', $content,
+ $exclusivemode, $fromctx, $ctx, $rec, $page, $totalpages);
+}
* Renders html to print list of courses tagged with particular tag
*
* @param int $tagid id of the tag
+ * @param bool $exclusivemode if set to true it means that no other entities tagged with this tag
+ * are displayed on the page and the per-page limit may be bigger
+ * @param int $fromctx context id where the link was displayed, may be used by callbacks
+ * to display items in the same context first
+ * @param int $ctx context id where to search for records
+ * @param bool $rec search in subcontexts as well
+ * @param array $displayoptions
* @return string empty string if no courses are marked with this tag or rendered list of courses
*/
- public function tagged_courses($tagid) {
+ public function tagged_courses($tagid, $exclusivemode = true, $ctx = 0, $rec = true, $displayoptions = null) {
global $CFG;
- require_once($CFG->libdir. '/coursecatlib.php');
- $displayoptions = array('limit' => $CFG->coursesperpage);
- $displayoptions['viewmoreurl'] = new moodle_url('/course/search.php',
- array('tagid' => $tagid, 'page' => 1, 'perpage' => $CFG->coursesperpage));
- $displayoptions['viewmoretext'] = new lang_string('findmorecourses');
+ require_once($CFG->libdir . '/coursecatlib.php');
+ if (empty($displayoptions)) {
+ $displayoptions = array();
+ }
+ $showcategories = coursecat::count_all() > 1;
+ $displayoptions += array('limit' => $CFG->coursesperpage, 'offset' => 0);
$chelper = new coursecat_helper();
- $searchcriteria = array('tagid' => $tagid);
- $chelper->set_show_courses(self::COURSECAT_SHOW_COURSES_EXPANDED_WITH_CAT)->
- set_search_criteria(array('tagid' => $tagid))->
+ $searchcriteria = array('tagid' => $tagid, 'ctx' => $ctx, 'rec' => $rec);
+ $chelper->set_show_courses($showcategories ? self::COURSECAT_SHOW_COURSES_EXPANDED_WITH_CAT :
+ self::COURSECAT_SHOW_COURSES_EXPANDED)->
+ set_search_criteria($searchcriteria)->
set_courses_display_options($displayoptions)->
set_attributes(array('class' => 'course-search-result course-search-result-tagid'));
// (we set the same css class as in search results by tagid)
- $courses = coursecat::search_courses($searchcriteria, $chelper->get_courses_display_options());
- $totalcount = coursecat::search_courses_count($searchcriteria);
- $content = $this->coursecat_courses($chelper, $courses, $totalcount);
- if ($totalcount) {
- require_once $CFG->dirroot.'/tag/lib.php';
- $heading = get_string('courses') . ' ' . get_string('taggedwith', 'tag', tag_get_name($tagid)) .': '. $totalcount;
- return $this->heading($heading, 3). $content;
+ if ($totalcount = coursecat::search_courses_count($searchcriteria)) {
+ $courses = coursecat::search_courses($searchcriteria, $chelper->get_courses_display_options());
+ if ($exclusivemode) {
+ return $this->coursecat_courses($chelper, $courses, $totalcount);
+ } else {
+ $tagfeed = new core_tag\output\tagfeed();
+ $img = $this->output->pix_icon('i/course', '');
+ foreach ($courses as $course) {
+ $url = course_get_url($course);
+ $imgwithlink = html_writer::link($url, $img);
+ $coursename = html_writer::link($url, $course->get_formatted_name());
+ $details = '';
+ if ($showcategories && ($cat = coursecat::get($course->category, IGNORE_MISSING))) {
+ $details = get_string('category').': '.
+ html_writer::link(new moodle_url('/course/index.php', array('categoryid' => $cat->id)),
+ $cat->get_formatted_name(), array('class' => $cat->visible ? '' : 'dimmed'));
+ }
+ $tagfeed->add($imgwithlink, $coursename, $details);
+ }
+ return $this->output->render_from_template('core_tag/tagfeed', $tagfeed->export_for_template($this->output));
+ }
}
return '';
}
*/
require_once("../config.php");
-require_once($CFG->dirroot . '/tag/lib.php');
require_once($CFG->dirroot . '/course/tags_form.php');
$id = required_param('id', PARAM_INT); // Course id.
print_error('coursehidden', '', $CFG->wwwroot .'/');
}
require_capability('moodle/course:tag', $context);
-if (empty($CFG->usetags)) {
+if (!core_tag_tag::is_enabled('core', 'course')) {
print_error('tagsaredisabled', 'tag');
}
$PAGE->set_heading($course->fullname);
$form = new coursetags_form();
-$data = array('id' => $course->id, 'tags' => tag_get_tags_array('course', $course->id));
+$data = array('id' => $course->id, 'tags' => core_tag_tag::get_item_tags_array('core', 'course', $course->id));
$form->set_data($data);
$redirecturl = $returnurl ? new moodle_url($returnurl) : course_get_url($course);
if ($form->is_cancelled()) {
redirect($redirecturl);
} else if ($data = $form->get_data()) {
- tag_set('course', $course->id, $data->tags, 'core', context_course::instance($course->id)->id);
+ core_tag_tag::set_item_tags('core', 'course', $course->id, context_course::instance($course->id), $data->tags);
redirect($redirecturl);
}
public function definition() {
$mform = $this->_form;
- $mform->addElement('tags', 'tags', get_string('tags'));
+ $mform->addElement('tags', 'tags', get_string('tags'),
+ array('itemtype' => 'course', 'component' => 'core'));
$mform->addElement('hidden', 'id', null);
$mform->setType('id', PARAM_INT);
require_once($CFG->dirroot . '/course/lib.php');
require_once($CFG->dirroot . '/course/tests/fixtures/course_capability_assignment.php');
require_once($CFG->dirroot . '/enrol/imsenterprise/tests/imsenterprise_test.php');
-require_once($CFG->dirroot . '/tag/lib.php');
class core_course_courselib_testcase extends advanced_testcase {
*/
public function test_course_delete_module($type, $options) {
global $DB;
+
$this->resetAfterTest(true);
$this->setAdminUser();
switch ($type) {
case 'assign':
// Add some tags to this assignment.
- tag_set('assign', $module->id, array('Tag 1', 'Tag 2', 'Tag 3'), 'mod_assign', $modcontext->id);
+ core_tag_tag::set_item_tags('mod_assign', 'assign', $module->id, $modcontext, array('Tag 1', 'Tag 2', 'Tag 3'));
// Confirm the tag instances were added.
$criteria = array('component' => 'mod_assign', 'contextid' => $modcontext->id);
*/
public function test_search_courses () {
- global $DB, $CFG;
- require_once($CFG->dirroot . '/tag/lib.php');
+ global $DB;
$this->resetAfterTest(true);
$this->setAdminUser();
// Enable coursetag option.
set_config('block_tags_showcoursetags', true);
// Add tag 'TAG-LABEL ON SECOND COURSE' to Course2.
- tag_set('course', $course2->id, array('TAG-LABEL ON SECOND COURSE'), 'core', context_course::instance($course2->id)->id);
- $taginstance = $DB->get_record('tag_instance', array('itemtype' => 'course', 'itemid' => $course2->id), '*', MUST_EXIST);
+ core_tag_tag::set_item_tags('core', 'course', $course2->id, context_course::instance($course2->id),
+ array('TAG-LABEL ON SECOND COURSE'));
+ $taginstance = $DB->get_record('tag_instance',
+ array('itemtype' => 'course', 'itemid' => $course2->id), '*', MUST_EXIST);
// Search by tagid.
$results = core_course_external::search_courses('tagid', $taginstance->tagid);
$results = external_api::clean_returnvalue(core_course_external::search_courses_returns(), $results);
} else if (!empty($search['tagid'])) {
// Search courses that are tagged with the specified tag.
$where = "c.id IN (SELECT t.itemid ".
- "FROM {tag_instance} t WHERE t.tagid = :tagid AND t.itemtype = :itemtype)";
- $params = array('tagid' => $search['tagid'], 'itemtype' => 'course');
+ "FROM {tag_instance} t WHERE t.tagid = :tagid AND t.itemtype = :itemtype AND t.component = :component)";
+ $params = array('tagid' => $search['tagid'], 'itemtype' => 'course', 'component' => 'core');
+ if (!empty($search['ctx'])) {
+ $rec = isset($search['rec']) ? $search['rec'] : true;
+ $parentcontext = context::instance_by_id($search['ctx']);
+ if ($parentcontext->contextlevel == CONTEXT_SYSTEM && $rec) {
+ // Parent context is system context and recursive is set to yes.
+ // Nothing to filter - all courses fall into this condition.
+ } else if ($rec) {
+ // Filter all courses in the parent context at any level.
+ $where .= ' AND ctx.path LIKE :contextpath';
+ $params['contextpath'] = $parentcontext->path . '%';
+ } else if ($parentcontext->contextlevel == CONTEXT_COURSECAT) {
+ // All courses in the given course category.
+ $where .= ' AND c.category = :category';
+ $params['category'] = $parentcontext->instanceid;
+ } else {
+ // No courses will satisfy the context criterion, do not bother searching.
+ $where = '1=0';
+ }
+ }
} else {
debugging('No criteria is specified while searching courses', DEBUG_DEVELOPER);
return array();
require_once($CFG->libdir.'/questionlib.php');
require_once($CFG->libdir.'/gradelib.php');
require_once($CFG->dirroot.'/group/lib.php');
- require_once($CFG->dirroot.'/tag/lib.php');
require_once($CFG->dirroot.'/comment/lib.php');
require_once($CFG->dirroot.'/rating/lib.php');
require_once($CFG->dirroot.'/notes/lib.php');
$rm->delete_ratings($delopt);
// Delete course tags.
- tag_set('course', $course->id, array(), 'core', $coursecontext->id);
+ core_tag_tag::remove_all_item_tags('core', 'course', $course->id);
// Delete calendar events.
$DB->delete_records('event', array('courseid' => $course->id));