';
+ $coursetagdivs .= '"f_commtags", ';
+ }
+ // Tidy up the end of a javascript array and add javascript
+ $coursetagdivs = rtrim($coursetagdivs, ', ');
+ $this->content->text .= coursetag_get_jscript($coursetagdivs);
+
+ // Add the divs (containing the tags) to the block's content
+ if ($alltags) { $this->content->text .= $alltagscontent; }
+ if ($mytags) { $this->content->text .= $mytagscontent; }
+ if ($officialtags) { $this->content->text .= $officialtagscontent; }
+ if ($coursetags) { $this->content->text .= $coursetagscontent; }
+ if ($commtags) { $this->content->text .= $commtagscontent; }
+
+ // add the input form section (allowing a user to tag the current course) and navigation, or loggin message
+ if ($loggedin) {
+ // only show the input form on course pages for those allowed (or not barred)
+ if ($coursepage && $canedit) {
+ //$this->content->footer .= coursetag_get_jscript();
+ $tagthisunit = get_string('tagthisunit', $tagslang);
+ $buttonadd = get_string('add', $tagslang);
+ $arrowtitle = get_string('arrowtitle', $tagslang);
+ $coursetaghelpbutton = helpbutton('addtags', 'adding tags', $tagslang, TRUE, FALSE, '', TRUE);
+ $this->content->footer .= <<
+
+EOT;
+ // add the edit link
+ $this->content->footer .= '
+
';
+ }
+
+ // Navigation elements at the bottom of the block
+ // show the alternative displays options if available
+ if ($mytags or $officialtags or $commtags or $coursetags) {
+ $this->content->footer .= '';
+ }
+ if ($mytags) {
+ $this->content->footer .= '
+
+ '.get_string('mytags2', $tagslang).' |';
+ }
+ if ($alltags and ($mytags or $officialtags or $commtags or $coursetags)) {
+ $this->content->footer .= '
+
+ '.get_string('alltags1', $tagslang).' |';
+ }
+ if ($officialtags) {
+ $this->content->footer .= '
+
+ '.get_string('officialtags1', $tagslang).' |';
+ }
+ if ($commtags) {
+ $this->content->footer .= '
+
+ '.get_string('communitytags1', $tagslang).' |';
+ }
+ if ($coursetags) {
+ $this->content->footer .= '
+
+ '.get_string('coursetags1', $tagslang).' |';
+ }
+ $this->content->footer = rtrim($this->content->footer, '|');
+ } else {
+ //if not logged in
+ $this->content->footer = ''.get_string('please', $tagslang).'
+ '.get_string('login', $tagslang).'
+ '.get_string('tagunits', $tagslang);
+ }
+ }
+ // end of show course tags section
+
return $this->content;
}
@@ -81,6 +333,21 @@
notice(get_string('blockconfigbad'), str_replace('blockaction=', 'dummy=', qualified_me()));
}
}
+
+ /*
+ * function removed until rsslib supports dc/cc
+ */
+ /*
+ function cron() {
+ if (SHOWCOURSETAGS) {
+ global $CFG;
+ require_once($CFG->dirroot.'/tag/coursetagslib.php');
+ return coursetag_rss_feeds();
+ } else {
+ return TRUE;
}
+ }
+ */
+}
?>
Index: blocks/tags/coursetags.js
===================================================================
RCS file: blocks/tags/coursetags.js
diff -N blocks/tags/coursetags.js
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ blocks/tags/coursetags.js 19 Jun 2008 10:04:43 -0000
@@ -0,0 +1,62 @@
+/**
+ * coursetags.js
+ * @author j.beedell@open.ac.uk July07
+ *
+ * getKeywords modified from an original script (Auto Complete Textfield)
+ * from The JavaScript Source http://javascript.internet.com
+ * originally created by: Timothy Groves http://www.brandspankingnew.net/
+ */
+
+
+function ctags_show_div(mydiv) {
+ for(x in coursetagdivs) {
+ if(mydiv == coursetagdivs[x]) {
+ document.getElementById(coursetagdivs[x]).style.display="block";
+ } else {
+ document.getElementById(coursetagdivs[x]).style.display="none";
+ }
+ }
+ return false;
+}
+
+var sug = "";
+var sug_disp = "";
+
+function ctags_getKeywords() {
+ /*
+ // This 'workaround' removing the xhtml strict form autocomplete="off" needs to
+ // be added to the body onload() script to work - but decided not to include
+ // (having the browser list might help with screen readers more than this script)
+ // document.forms['coursetag'].setAttribute("autocomplete", "off");
+ */
+ var input = document.forms['coursetag'].coursetag_new_tag.value;
+ var len = input.length;
+ sug_disp = ""; sug = "";
+
+ if (input.length) {
+ for (ele in coursetag_tags)
+ {
+ if (coursetag_tags[ele].substr(0,len).toLowerCase() == input.toLowerCase())
+ {
+ sug_disp = input + coursetag_tags[ele].substr(len);
+ sug = coursetag_tags[ele];
+ break;
+ }
+ }
+ }
+ document.forms['coursetag'].coursetag_sug_keyword.value = sug_disp;
+ if (!sug.length || input == sug_disp)
+ document.getElementById('coursetag_sug_btn').style.display = "none";
+ else
+ document.getElementById('coursetag_sug_btn').style.display = "block";
+}
+
+function ctags_setKeywords() {
+ document.forms['coursetag'].coursetag_new_tag.value = sug;
+ ctags_hideSug();
+}
+
+function ctags_hideSug() {
+ document.forms['coursetag'].coursetag_sug_keyword.value = "";
+ document.getElementById('coursetag_sug_btn').style.display = "none";
+}
Index: blocks/tags/settings.php
===================================================================
RCS file: blocks/tags/settings.php
diff -N blocks/tags/settings.php
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ blocks/tags/settings.php 19 Jun 2008 10:04:43 -0000
@@ -0,0 +1,6 @@
+add(new admin_setting_configcheckbox('block_tags_showcoursetags', get_string('showcoursetags', 'block_tags'),
+ get_string('showcoursetagsdef', 'block_tags'), 0));
+
+?>
Index: blocks/tags/styles.php
===================================================================
RCS file: blocks/tags/styles.php
diff -N blocks/tags/styles.php
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ blocks/tags/styles.php 19 Jun 2008 10:04:43 -0000
@@ -0,0 +1,116 @@
+/*
+ * CSS for course tags
+ * @author j.beedell@open.ac.uk July07
+ *
+ * Styles for block_tags.php
+ */
+
+.coursetag_form_wrapper {
+ margin: auto;
+ width: 13em;
+}
+
+.coursetag_form_positioner {
+ position: relative;
+ margin: 5px 0 0 0;
+ height: 25px;
+}
+
+.coursetag_form_input1 {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+
+.coursetag_form_input2 {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 2;
+}
+
+.coursetag_form_input3 {
+ position: absolute;
+ top: 3px;
+ left: 12.8em;
+ display: none;
+}
+
+.coursetag_form_input1a {
+ background-color: white;
+ border: 1px solid #999;
+ width: 12em;
+ padding: 2px;
+}
+
+.coursetag_form_input2a {
+ background: transparent;
+ color: #669954;
+ border: 1px solid #999;
+ width: 12em;
+ padding: 2px;
+}
+
+.coursetag_morelink {
+ float: right;
+ font-size: 0.8em;
+ margin: -5px 5px 5px 0;
+}
+
+.coursetag_list {
+ padding-top: 4px;
+}
+
+/* Styles for edit_tags.php */
+
+.coursetag_edit_centered {
+ position: relative;
+ width: 600px;
+ margin: 20px auto;
+}
+
+.coursetag_edit_row {
+ margin: 5px 0 5px 0;
+ height: 30px;
+}
+
+.coursetag_edit_left {
+ position: relative;
+ float: left;
+ padding: 3px 5px;
+}
+
+.coursetag_edit_right {
+ position: relative;
+ float: left;
+ padding: 3px 0px;
+}
+
+.coursetag_edit_input3 {
+ position: relative;
+ left: 10.5em;
+ display: none;
+}
+
+/* Styles for more_tags.php */
+
+.coursetag_more_title {
+ margin: 30px 30px -25px 30px;
+}
+
+.coursetag_more_tags {
+ margin: 30px;
+}
+
+.coursetag_more_large {
+ font-size: 120%
+}
+
+.coursetag_more_small {
+ font-size: 80%
+}
+
+.coursetag_more_link {
+ font-size: 80%;
+}
Index: course/lib.php
===================================================================
RCS file: /cvsroot/moodle/moodle/course/lib.php,v
retrieving revision 1.604
diff -u -F ^f -w -b -B -a -u -r1.604 lib.php
--- course/lib.php 16 Jun 2008 14:25:53 -0000 1.604
+++ course/lib.php 19 Jun 2008 10:04:44 -0000
@@ -40,6 +40,9 @@ function make_log_url($module, $url) {
case 'upload':
return $url;
break;
+ case 'coursetags':
+ return '/'.$url;
+ break;
case 'library':
case '':
return '/';
Index: lang/en_utf8/block_tags.php
===================================================================
RCS file: lang/en_utf8/block_tags.php
diff -N lang/en_utf8/block_tags.php
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lang/en_utf8/block_tags.php 19 Jun 2008 10:04:44 -0000
@@ -0,0 +1,66 @@
+
Index: lang/en_utf8/tag.php
===================================================================
RCS file: /cvsroot/moodle/moodle/lang/en_utf8/tag.php,v
retrieving revision 1.15
diff -u -F ^f -w -b -B -a -u -r1.15 tag.php
--- lang/en_utf8/tag.php 29 Feb 2008 09:35:04 -0000 1.15
+++ lang/en_utf8/tag.php 19 Jun 2008 10:04:45 -0000
@@ -10,7 +10,11 @@
$string['description'] = 'Description';
$string['delete'] = 'Delete';
$string['deleted'] = 'Deleted';
+$string['deletedcoursetags'] = 'Deleted - course tags';
$string['edittag'] = 'Edit this tag';
+$string['errordeleting'] = 'Error deleting tag with id $a, please report to your system administrator.';
+$string['errortagfrontpage'] = 'Tagging the site main page is not allowed';
+$string['errorupdatingrecord'] = 'Error updating tag record';
$string['flag'] = 'Flag';
$string['flagasinappropriate'] = 'Flag as inappropriate';
$string['helprelatedtags'] = 'Comma separated related tags';
@@ -30,6 +34,8 @@
$string['responsiblewillbenotified'] = 'The person responsible will be notified';
$string['resetflag'] = 'Reset flag';
$string['reset'] = 'Reset';
+$string['rsstitle'] = 'Course Tags RSS Feed for user: $a';
+$string['rssdesc'] = 'This RSS feed was automatically generated by Moodle and contains user generated tags for courses.';
$string['search'] = 'Search';
$string['seeallblogs'] = 'See all blogs with this tag';
$string['searchresultsfor'] = 'Search results for \"$a\"';
@@ -40,9 +46,11 @@
$string['tagtype'] = 'Tag type';
$string['tagtype_official'] = 'Official';
$string['tagtype_default'] = 'Default';
+$string['tagindex_coursetitle'] = 'Courses tagged with $a';
$string['tags'] = 'Tags';
$string['tagsaredisabled'] = 'Tags are disabled';
$string['thingstaggedwith'] = '$a->count things tagged with \"$a->name\"';
+$string['thingtaggedwith'] = '$a->count thing tagged with \"$a->name\"';
$string['thistaghasnodesc'] = 'This tag currently has no description.';
$string['timemodified'] = 'Modified';
$string['typechanged'] = 'Tag type changed';
Index: lang/en_utf8/help/block_tags/addtags.html
===================================================================
RCS file: lang/en_utf8/help/block_tags/addtags.html
diff -N lang/en_utf8/help/block_tags/addtags.html
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ lang/en_utf8/help/block_tags/addtags.html 19 Jun 2008 10:04:45 -0000
@@ -0,0 +1,27 @@
+
Adding a tag for a course
+
+
Logged on users may 'tag' courses.
+
+
A tag is a shortcut or way of navigating to your favourite things.
+
+
Not only can you tag courses, but you may also tag your blogs, or even your own profile.
+
+
Clicking on a tag will take you to a page listing all the things associated with that tag.
+If the tag is a popular one you will be able to see what other things other users have associated
+with that tag.
+
+
You may add as many tags as you like. While it is recommended to only add one tag at a time,
+more tags could be entered on one occasion by seperating the tags with a comma.
+As you are adding a tag you may notice a word appearing in the background where you are typing.
+If this word is what you want as your tag then you can click on the little
+arrow next to the entry box to save typing the that word (and don't forget to click submit to save).
+
+
Tags must be more than one character and may be up to 50 characters long.
+Please note that while extended characters are allowed (e.g. French acute
+accented characters or Chinese characters), special characters will be
+stripped (e.g. "',\,_,<,-,~,?").
+Also note that tags cannot be pure integers or float number (e.g. 1 or 1.11)
+but number and letter combinations are fine (e.g. 1a).
+Finally, commas cannot be used in tag names, as these are separators between tags entered.
+
+
Don't forget to click the 'Submit' button below to save your new tag.
You will only be able to delete a tag entry that you have previously created.
+This allows you to tidy up those mis-spelled, or out-dated tags. Please note that
+deletion will only delete the tag if no other user has tagged something else with it,
+otherwise deletion will just delete your association of that tag for the course.
+
+
Deleting is done by highlighting the tag you wish to delete under 'Select...',
+then clicking the 'Submit' button below.
A note about the tag count. Hovering the mouse over a tag will reveal a tag count message
+like '2 things tagged with ...'.
+This count (number) will vary depending on where the tag is being displayed at the time.
+
+
The 'More tags' page (and the tags block) can display several different selections of tags
+- for instance 'all tags' or 'my tags'.
+The count displayed for a tag under 'all tags' may be different to the count for the same tag
+displayed under the 'my tags' or one of the other selections.
+This is because when 'all tags' is showing, all tags for courses, blogs and user profiles
+are displayed and counted.
+Where as when 'my tags' is showing, only your own tags for courses you have tagged
+are displayed and counted.
+So the count could be quite different for one tag under different sections.
+
+
Of course the size of the tag is also a clue to the count. The bigger the font size for the tag the
+more popular the tag is.
+
+
In fact it is easy to re-order the tags displayed by popularity, using the link provided.
+And the tags may be re-ordered alphabetically or in date of creation order as well. Try it.
'."\n";
+
+ if ($return) {
+ return $output;
+ } else {
+ echo $output;
+ }
+}
+
+/**
+ * Returns javascript for use in tags block and supporting pages
+ * @param string $coursetagdivs comma separated divs ids
+ * @uses $CFG
+ */
+function coursetag_get_jscript($coursetagdivs = '') {
+
+ global $CFG, $DB;
+
+ $tabscript = '';
+ if ($coursetagdivs) {
+ $tabscript = 'var coursetagdivs = new Array('.$coursetagdivs.');';
+ }
+
+ $coursetags = $DB->get_records('tag', null, 'name ASC', 'name, id');
+ $a = 0;
+ $coursetagscript = '';
+ if (!empty($coursetags)) {
+ foreach ($coursetags as $key => $value) {
+ $coursetagscript .= "coursetag_tags[$a] = \"".addslashes_js($key)."\"; ";
+ $a++;
+ }
+ }
+
+ $jserror1 = get_string('jserror1', 'block_tags');
+ $jserror2 = get_string('jserror2', 'block_tags');
+
+ $inputscript = << 50) {
+ alert("$jserror1");
+ return false;
+ //can't check this - unterminated string error } else if (val.indexOf("\\") > 0) {
+ } else if (val.indexOf("<") > 0) {
+ alert("$jserror2");
+ return false;
+ } else if (val.indexOf(">") > 0) {
+ alert("$jserror2");
+ return false;
+ } else {
+ return true;
+ }
+ }
+EOT;
+
+ $str = '
+
+ ';
+
+ return $str;
+}
+
+/**
+ * Returns all tags created by a user for a course
+ *
+ * @uses $CFG
+ * @param int $courseid
+ * @param int $userid
+ */
+function coursetag_get_records($courseid, $userid) {
+
+ global $CFG, $DB;
+
+ $sql = "SELECT t.id, name, rawname
+ FROM {tag} t, {tag_instance} ti
+ WHERE t.id = ti.tagid
+ AND ti.tiuserid = :userid
+ AND ti.itemid = :courseid
+ ORDER BY name ASC";
+
+ return $DB->get_records_sql($sql, array('userid'=>$userid, 'courseid'=>$courseid));
+}
+
+/**
+ * Stores a tag for a course for a user
+ *
+ * @uses $CFG
+ * @param array $tags simple array of keywords to be stored
+ * @param integer $courseid
+ * @param integer $userid
+ * @param string $tagtype official or default only
+ * @param string $myurl optional for logging creation of course tags
+ */
+function coursetag_store_keywords($tags, $courseid, $userid=0, $tagtype='official', $myurl='') {
+
+ global $CFG;
+
+ if (is_array($tags) and !empty($tags)) {
+
+ //tag_set_add('course', $courseid, $tags, $userid);
+ //if ($tagtype == 'official') {
+ // $tags_ids = tag_get_id($tags);
+ //}
+
+ foreach($tags as $tag) {
+ $tag = trim($tag);
+ if (strlen($tag) > 0) {
+ tag_set_add('course', $courseid, $tag, $userid);
+ if ($myurl) {
+ $url = $myurl.'?query='.urlencode($tag);
+ }
+ if ($tagtype == 'default' and $myurl != '') {
+ // log the tagging request - note only for user added tags
+ add_to_log($courseid, 'coursetags', 'add', $url, 'Course tagged');
+ }
+ if ($tagtype == 'official') {
+ tag_type_set(tag_get_id($tag), $tagtype);
+ }
+ }
+ }
+ }
+
+}
+
+/**
+ * Deletes a personal tag for a user for a course.
+ *
+ * @uses $CFG
+ * @param int $tagid
+ * @param int $userid
+ * @param int $courseid
+ */
+function coursetag_delete_keyword($tagid, $userid, $courseid) {
+
+ global $CFG, $DB;
+
+ $sql = "SELECT COUNT(*)
+ FROM {tag_instance}
+ WHERE tagid = $tagid
+ AND tiuserid = $userid
+ AND itemtype = 'course'
+ AND itemid = $courseid";
+ if ($DB->count_records_sql($sql) == 1) {
+ $sql = "tagid = $tagid
+ AND tiuserid = $userid
+ AND itemtype = 'course'
+ AND itemid = $courseid";
+ $DB->delete_records_select('tag_instance', $sql);
+ // if there are no other instances of the tag then consider deleting the tag as well
+ if (!$DB->record_exists('tag_instance', array('tagid' => $tagid))) {
+ // if the tag is a personal tag then delete it - don't do official tags
+ if ($DB->record_exists('tag', array('id' => $tagid, 'tagtype' => 'default'))) {
+ $DB->delete_records('tag', array('id' => $tagid, 'tagtype' => 'default'));
+ }
+ }
+ } else {
+ print_error("errordeleting", 'tag', '', $tagid);
+ }
+
+}
+
+/**
+ * Get courses tagged with a tag
+ *
+ * @param int $tagid
+ * @return array of course objects
+ */
+function coursetag_get_tagged_courses($tagid) {
+
+ global $DB;
+
+ $courses = array();
+ if ($crs = $DB->get_records_select('tag_instance', "tagid=:tagid AND itemtype='course'", array('tagid'=>$tagid))) {
+ foreach ($crs as $c) {
+ //this capability check was introduced to stop display of courses that a student could not
+ //view, but arguably it is best that when clicking on a tag, the tagged course summary should
+ //be seen and then if the student clicks on that they will be given the opportunity to join
+ //note courses not visible should not have their tagid sent to this function
+ //if (has_capability('moodle/course:view', get_context_instance(CONTEXT_COURSE, $c->itemid))) {
+ $course = $DB->get_record('course', array('id'=>$c->itemid));
+ $courses[$c->itemid] = $course;
+ //}
+ }
+ }
+ return $courses;
+
+}
+
+/**
+ * Course tagging function used only during the deletion of a
+ * course (called by lib/moodlelib.php) to clean up associated tags
+ *
+ * @param $courseid
+ * @param $showfeedback
+ */
+function coursetag_delete_course_tags($courseid, $showfeedback=false) {
+
+ global $DB;
+
+ if ($tags = $DB->get_records_select('tag_instance', "itemtype='course' AND itemid=:courseid", array('courseid'=>$courseid))) {
+ foreach ($tags as $tag) {
+ //delete the course tag instance record
+ $DB->delete_records('tag_instance', array('tagid'=>$tag->tagid, 'itemtype'=>'course', 'itemid'=> $courseid));
+ // delete tag if there are no other tag_instance entries now
+ if (!($DB->record_exists('tag_instance', array('tagid'=>$tag->tagid)))) {
+ $DB->delete_records('tag', array('id'=>$tag->tagid));
+ }
+ }
+ }
+
+ if ($showfeedback) {
+ notify(get_string('deletedcoursetags', 'tag'));
+ }
+}
+
+/**
+ * Function called by cron to create/update users rss feeds
+ *
+ * @uses $CFG
+ * @return true
+ *
+ * Function removed.
+ * rsslib.php needs updating to accept Dublin Core tags (dc/cc) input before this can work.
+ */
+/*
+function coursetag_rss_feeds() {
+
+ global $CFG, $DB;
+ require_once($CFG->dirroot.'/lib/dmllib.php');
+ require_once($CFG->dirroot.'/lib/rsslib.php');
+
+ $status = true;
+ mtrace(' Preparing to update all user unit tags RSS feeds');
+ if (empty($CFG->enablerssfeeds)) {
+ mtrace(' RSS DISABLED (admin variables - enablerssfeeds)');
+ } else {
+
+ // Load all the categories for use later on
+ $categories = $DB->get_records('course_categories');
+
+ // get list of users who have tagged a unit
+ $sql = "
+ SELECT DISTINCT u.id as userid, u.username, u.firstname, u.lastname, u.email
+ FROM {user} u, {course} c, {tag_instance} cti, {tag} t
+ WHERE c.id = cti.itemid
+ AND u.id = cti.tiuserid
+ AND t.id = cti.tagid
+ AND t.tagtype = 'personal'
+ AND u.confirmed = 1
+ AND u.deleted = 0
+ ORDER BY userid";
+ if ($users = $DB->get_records_sql($sql)) {
+
+ $items = array(); //contains rss data items for each user
+ foreach ($users as $user) {
+
+ // loop through each user, getting the data (tags for courses)
+ $sql = "
+ SELECT cti.id, c.id as courseid, c.fullname, c.shortname, c.category, t.rawname, cti.timemodified
+ FROM {course} c, {tag_instance} cti, {tag} t
+ WHERE c.id = cti.itemid
+ AND cti.tiuserid = :userid{$user->userid}
+ AND cti.tagid = t.id
+ AND t.tagtype = 'personal'
+ ORDER BY courseid";
+ if ($usertags = $DB->get_records_sql($sql, array('userid' => $user->userid))) {
+ $latest_date = 0; //latest date any tag was created by a user
+ $c = 0; //course identifier
+
+ foreach ($usertags as $usertag) {
+ if ($usertag->courseid != $c) {
+ $c = $usertag->courseid;
+ $items[$c] = new stdClass();
+ $items[$c]->title = $usertag->fullname . '(' . $usertag->shortname . ')';
+ $items[$c]->link = $CFG->wwwroot . '/course/view.php?name=' . $usertag->shortname;
+ $items[$c]->description = ''; //needs to be blank
+ $items[$c]->category = $categories[$usertag->category]->name;
+ $items[$c]->subject[] = $usertag->rawname;
+ $items[$c]->pubdate = $usertag->timemodified;
+ $items[$c]->tag = true;
+ } else {
+ $items[$c]->subject[] .= $usertag->rawname;
+ }
+ // Check and set the latest modified date.
+ $latest_date = $usertag->timemodified > $latest_date ? $usertag->timemodified : $latest_date;
+ }
+
+ // Setup some vars for use while creating the file
+ $path = $CFG->dataroot.'/1/usertagsrss/'.$user->userid;
+ $file_name = 'user_unit_tags_rss.xml';
+ $title = get_string('rsstitle', 'tag', ucwords(strtolower($user->firstname.' '.$user->lastname)));
+ $desc = get_string('rssdesc', 'tag');
+ // check that the path exists
+ if (!file_exists($path)) {
+ mtrace(' Creating folder '.$path);
+ check_dir_exists($path, TRUE, TRUE);
+ }
+
+ // create or update the feed for the user
+ // this functionality can be copied into seperate lib as in next two lines
+ //require_once($CFG->dirroot.'/local/ocilib.php');
+ //oci_create_rss_feed( $path, $file_name, $latest_date, $items, $title, $desc, $dc=true, $cc=false);
+
+ // Set path to RSS file
+ $full_path = "$save_path/$file_name";
+
+ mtrace(" Preparing to update RSS feed for $file_name");
+
+ // First let's make sure there is work to do by checking the time the file was last modified,
+ // if a course was update after the file was mofified
+ if (file_exists($full_path)) {
+ if ($lastmodified = filemtime($full_path)) {
+ mtrace(" XML File $file_name Created on ".date( "D, j M Y G:i:s T", $lastmodified ));
+ mtrace(' Lastest course modification on '.date( "D, j M Y G:i:s T", $latest_date ));
+ if ($latest_date > $lastmodified) {
+ mtrace(" XML File $file_name needs updating");
+ $changes = true;
+ } else {
+ mtrace(" XML File $file_name doesn't need updating");
+ $changes = false;
+ }
+ }
+ } else {
+ mtrace(" XML File $file_name needs updating");
+ $changes = true;
+ }
+
+ if ($changes) {
+ // Now we know something has changed, write the new file
+
+ if (!empty($items)) {
+ // First set rss feeds common headers
+ $header = rss_standard_header(strip_tags(format_string($title,true)),
+ $CFG->wwwroot,
+ $desc,
+ true, true);
+ // Now all the rss items
+ if (!empty($header)) {
+ $articles = rss_add_items($items,$dc,$cc);
+ }
+ // Now all rss feeds common footers
+ if (!empty($header) && !empty($articles)) {
+ $footer = rss_standard_footer();
+ }
+ // Now, if everything is ok, concatenate it
+ if (!empty($header) && !empty($articles) && !empty($footer)) {
+ $result = $header.$articles.$footer;
+ } else {
+ $result = false;
+ }
+ } else {
+ $result = false;
+ }
+
+ // Save the XML contents to file
+ if (!empty($result)) {
+ $rss_file = fopen($full_path, "w");
+ if ($rss_file) {
+ $status = fwrite ($rss_file, $result);
+ fclose($rss_file);
+ } else {
+ $status = false;
+ }
+ }
+
+ // Output result
+ if (empty($result)) {
+ // There was nothing to put into the XML file. Delete it!
+ if( is_file($full_path) ) {
+ mtrace(" There were no items for XML File $file_name. Deleting XML File");
+ unlink($full_path);
+ mtrace(" $full_path -> (deleted)");
+ } else {
+ mtrace(" There were no items for the XML File $file_name and no file to delete. Ignore.");
+ }
+ } else {
+ if (!empty($status)) {
+ mtrace(" $full_path -> OK");
+ } else {
+ mtrace(" $full_path -> FAILED");
+ }
+ }
+ }
+ //end of oci_create_rss_feed()
+ }
+ }
+ }
+ }
+
+ return $status;
+}
+ */
+
+/**
+ * Get official keywords for the in header.html
+ * use: echo '';
+ * @uses $CFG
+ * @param int $courseid
+ * @return string
+ *
+ * Function removed but fully working
+ * This function is potentially useful to anyone wanting to improve search results for course pages.
+ * The idea is to add official tags (not personal tags to prevent their deletion) to all
+ * courses (facility not added yet) which will be automatically added to the page header to boost
+ * search engine specificity/ratings.
+ */
+/*
+function coursetag_get_official_keywords($courseid, $asarray=false) {
+ global $CFG;
+ $returnstr = '';
+ $sql = "SELECT t.id, name, rawname
+ FROM {tag} t, {tag_instance} ti
+ WHERE ti.itemid = :courseid
+ AND ti.itemtype = 'course'
+ AND t.tagtype = 'official'
+ AND ti.tagid = t.id
+ ORDER BY name ASC";
+ if ($tags = $DB->get_records_sql($sql, array('courseid' => $courseid))) {
+ if ($asarray) {
+ return $tags;
+ }
+ foreach ($tags as $tag) {
+ if( empty($CFG->keeptagnamecase) ) {
+ $textlib = textlib_get_instance();
+ $name = $textlib->strtotitle($tag->name);
+ } else {
+ $name = $tag->rawname;
+ }
+ $returnstr .= $name.', ';
+ }
+ $returnstr = rtrim($returnstr, ', ');
+ }
+ return $returnstr;
+}
+*/
+
+?>
Index: tag/edit.php
===================================================================
RCS file: /cvsroot/moodle/moodle/tag/edit.php,v
retrieving revision 1.25
diff -u -F ^f -w -b -B -a -u -r1.25 edit.php
--- tag/edit.php 9 Jun 2008 16:53:39 -0000 1.25
+++ tag/edit.php 19 Jun 2008 10:04:54 -0000
@@ -90,7 +90,7 @@
if (has_capability('moodle/tag:manage', $systemcontext)) {
// rename tag
if(!tag_rename($tag->id, $tagnew->rawname)) {
- error('Error updating tag record');
+ print_error('errorupdatingrecord', 'tag');
}
}
Index: tag/index.php
===================================================================
RCS file: /cvsroot/moodle/moodle/tag/index.php,v
retrieving revision 1.28
diff -u -F ^f -w -b -B -a -u -r1.28 index.php
--- tag/index.php 19 Jun 2008 10:02:10 -0000 1.28
+++ tag/index.php 19 Jun 2008 10:04:54 -0000
@@ -134,9 +134,26 @@
}
}
+// Display courses tagged with the tag
+require_once($CFG->dirroot.'/tag/coursetagslib.php');
+if ($courses = coursetag_get_tagged_courses($tag->id)) {
-echo '';
+ $totalcount = count( $courses );
+ $coursestitle = get_string('tagindex_coursetitle', 'tag', '"'.$tagname.'": '.$totalcount);
+
+ print_box_start('generalbox', 'tag-blogs'); //could use an id separate from tag-blogs, but would have to copy the css style to make it look the same
+
+ print_heading($coursestitle, '', 3);
+
+ foreach ($courses as $course) {
+ print_course($course);
+ print_spacer(5,5);
+ }
+ print_box_end();
+}
+
+echo '';
//----------------- right column -----------------
Index: tag/lib.php
===================================================================
RCS file: /cvsroot/moodle/moodle/tag/lib.php,v
retrieving revision 1.83
diff -u -F ^f -w -b -B -a -u -r1.83 lib.php
--- tag/lib.php 19 Jun 2008 10:02:11 -0000 1.83
+++ tag/lib.php 19 Jun 2008 10:04:55 -0000
@@ -63,9 +63,10 @@
* @param int $record_id the id of the record to tag
* @param array $tags the array of tags to set on the record. If
* given an empty array, all tags will be removed.
+ * @param int $userid optional only required for course tagging
* @return void
*/
-function tag_set($record_type, $record_id, $tags) {
+function tag_set($record_type, $record_id, $tags, $userid=0) {
static $in_recursion_semaphore = false; // this is to prevent loops when tagging a tag
if ( $record_type == 'tag' && !$in_recursion_semaphore) {
@@ -108,7 +109,7 @@ function tag_set($record_type, $record_i
$tag_current_id = $new_tag[$clean_tag];
}
- tag_assign($record_type, $record_id, $tag_current_id, $ordering);
+ tag_assign($record_type, $record_id, $tag_current_id, $ordering, $userid);
// if we are tagging a tag (adding a manually-assigned related tag), we
// need to create the opposite relationship as well.
@@ -127,17 +128,18 @@ function tag_set($record_type, $record_i
* 'user' for users, etc.
* @param int $record_id the id of the record to tag
* @param string $tag the tag to add
+ * @param int $userid optional only required for course tagging
* @return void
*/
-function tag_set_add($record_type, $record_id, $tag) {
+function tag_set_add($record_type, $record_id, $tag, $userid=0) {
$new_tags = array();
- foreach( tag_get_tags($record_type, $record_id) as $current_tag ) {
+ foreach( tag_get_tags($record_type, $record_id, NULL, $userid) as $current_tag ) {
$new_tags[] = $current_tag->rawname;
}
$new_tags[] = $tag;
- return tag_set($record_type, $record_id, $new_tags);
+ return tag_set($record_type, $record_id, $new_tags, $userid);
}
/**
@@ -236,9 +238,10 @@ function tag_get($field, $value, $return
* @param int $record_id the record id for which we want to get the tags
* @param string $type the tag type (either 'default' or 'official'). By default,
* all tags are returned.
+ * @param int $userid optional only required for course tagging
* @return array the array of tags
*/
-function tag_get_tags($record_type, $record_id, $type=null) {
+function tag_get_tags($record_type, $record_id, $type=null, $userid=0) {
global $CFG, $DB;
$params = array();
@@ -250,9 +253,15 @@ function tag_get_tags($record_type, $rec
$sql_type = '';
}
+ $u = null;
+ if ($userid) {
+ $u = "AND ti.tiuserid = :userid ";
+ $params['userid'] = $userid;
+ }
+
$sql = "SELECT tg.id, tg.tagtype, tg.name, tg.rawname, tg.flag, ti.ordering
FROM {tag_instance} ti JOIN {tag} tg ON tg.id = ti.tagid
- WHERE ti.itemtype = :recordtype AND ti.itemid = :recordid $sql_type
+ WHERE ti.itemtype = :recordtype AND ti.itemid = :recordid $u $sql_type
ORDER BY ti.ordering ASC";
$params['recordtype'] = $record_type;
$params['recordid'] = $record_id;
@@ -662,12 +671,13 @@ function tag_add($tags, $type="default")
* @param int $record_id the id of the record that will be tagged
* @param string $tagid the tag id to set on the record.
* @param int $ordering the order of the instance for this record
+ * @param int $userid optional only required for course tagging
* @return bool true on success, false otherwise
*/
-function tag_assign($record_type, $record_id, $tagid, $ordering) {
+function tag_assign($record_type, $record_id, $tagid, $ordering, $userid = 0) {
global $DB;
- if ( $tag_instance_object = $DB->get_record('tag_instance', array('tagid'=>$tagid, 'itemtype'=>$record_type, 'itemid'=>$record_id), 'id')) {
+ if ( $tag_instance_object = $DB->get_record('tag_instance', array('tagid'=>$tagid, 'itemtype'=>$record_type, 'itemid'=>$record_id, 'tiuserid'=>$userid), 'id')) {
$tag_instance_object->ordering = $ordering;
$tag_instance_object->timemodified = time();
return $DB->update_record('tag_instance', $tag_instance_object);
@@ -678,6 +688,7 @@ function tag_assign($record_type, $recor
$tag_instance_object->itemtype = $record_type;
$tag_instance_object->ordering = $ordering;
$tag_instance_object->timemodified = time();
+ $tag_instance_object->tiuserid = $userid;
return $DB->insert_record('tag_instance', $tag_instance_object);
}
}