dirroot.'/tag/lib.php');
require_once($CFG->libdir.'/filelib.php');
/**
* locallib.php - moodle tag local library - output functions
*
* @licence http://www.gnu.org/copyleft/gpl.html GNU Public License
* @package moodlecore
*
*/
/**
* Prints a tag cloud
*
* @param array $tagcloud array of tag objects (fields: id, name, rawname, count and flag)
* @param $return if true return html string
*/
function tag_print_cloud($nr_of_tags=150, $return=false) {
global $CFG, $DB;
$can_manage_tags = has_capability('moodle/tag:manage', get_context_instance(CONTEXT_SYSTEM));
if ( !$tagsincloud = $DB->get_records_sql('SELECT tg.rawname, tg.id, tg.name, tg.tagtype, COUNT(ti.id) AS count, tg.flag
FROM {tag_instance} ti JOIN {tag} tg ON tg.id = ti.tagid
WHERE ti.itemtype <> \'tag\'
GROUP BY tg.id, tg.rawname, tg.name, tg.flag, tg.tagtype
ORDER BY count DESC, tg.name ASC', null, 0, $nr_of_tags) ) {
$tagsincloud = array();
}
$tagkeys = array_keys($tagsincloud);
if (!empty($tagkeys)) {
$firsttagkey = $tagkeys[0];
$maxcount = $tagsincloud[$firsttagkey]->count;
}
$etags = array();
foreach ($tagsincloud as $tag) {
$size = (int) (( $tag->count / $maxcount) * 20);
$tag->class = "$tag->tagtype s$size";
$etags[] = $tag;
}
usort($etags, "tag_cloud_sort");
$output = '';
$output .= "\n
\n";
foreach ($etags as $tag) {
if ($tag->flag > 0 && $can_manage_tags) {
$tagname = ''. tag_display_name($tag) .'';
} else {
$tagname = tag_display_name($tag);
}
$link = $CFG->wwwroot .'/tag/index.php?tag='. rawurlencode($tag->name);
$output .= '- count) .'">'.
$tagname .'
';
}
$output .= "\n
\n";
if ($return) {
return $output;
} else {
echo $output;
}
}
/**
* This function is used by print_tag_cloud, to usort() the tags in the cloud.
* See php.net/usort for the parameters documentation. This was originally in
* blocks/blog_tags/block_blog_tags.php, named blog_tags_sort().
*/
function tag_cloud_sort($a, $b) {
global $CFG;
if (empty($CFG->tagsort)) {
$tagsort = 'name'; // by default, sort by name
} else {
$tagsort = $CFG->tagsort;
}
if (is_numeric($a->$tagsort)) {
return ($a->$tagsort == $b->$tagsort) ? 0 : ($a->$tagsort > $b->$tagsort) ? 1 : -1;
} elseif (is_string($a->$tagsort)) {
return strcmp($a->$tagsort, $b->$tagsort);
} else {
return 0;
}
}
/**
* Prints a box with the description of a tag and its related tags
*
* @param stdClass $tag_object
* @param $return if true return html string
*/
function tag_print_description_box($tag_object, $return=false) {
global $USER, $CFG, $OUTPUT;
$max_tags_displayed = 10; // todo: turn this into a system setting
$tagname = tag_display_name($tag_object);
$related_tags = tag_get_related_tags($tag_object->id, TAG_RELATED_ALL, $max_tags_displayed+1); // this gets one more than we want
$content = !empty($tag_object->description) || $related_tags;
$output = '';
if ($content) {
$output .= $OUTPUT->box_start('generalbox', 'tag-description');
}
if (!empty($tag_object->description)) {
$options = new stdClass();
$options->para = false;
$options->overflowdiv = true;
$tag_object->description = file_rewrite_pluginfile_urls($tag_object->description, 'pluginfile.php', get_context_instance(CONTEXT_SYSTEM)->id, 'tag', 'description', $tag_object->id);
$output .= format_text($tag_object->description, $tag_object->descriptionformat, $options);
}
if ($related_tags) {
$more_links = false;
if (count($related_tags) > $max_tags_displayed) {
array_pop($related_tags);
$more_links = true;
}
$output .= '
'. get_string('relatedtags', 'tag') .': '. tag_get_related_tags_csv($related_tags);
if ($more_links) {
$output .= ' ...';
}
}
if ($content) {
$output .= $OUTPUT->box_end();
}
if ($return) {
return $output;
} else {
echo $output;
}
}
/**
* Prints a box that contains the management links of a tag
*
* @param $tagid
* @param $return if true return html string
*/
function tag_print_management_box($tag_object, $return=false) {
global $USER, $CFG, $OUTPUT;
$tagname = tag_display_name($tag_object);
$output = '';
if (!isguestuser()) {
$output .= $OUTPUT->box_start('box','tag-management-box');
$systemcontext = get_context_instance(CONTEXT_SYSTEM);
$links = array();
// Add a link for users to add/remove this from their interests
if (tag_record_tagged_with('user', $USER->id, $tag_object->name)) {
$links[] = ''. get_string('removetagfrommyinterests', 'tag', $tagname) .'';
} else {
$links[] = ''. get_string('addtagtomyinterests', 'tag', $tagname) .'';
}
// flag as inappropriate link
$links[] = ''. get_string('flagasinappropriate', 'tag', rawurlencode($tagname)) .'';
// Edit tag: Only people with moodle/tag:edit capability who either have it as an interest or can manage tags
if (has_capability('moodle/tag:edit', $systemcontext) ||
has_capability('moodle/tag:manage', $systemcontext)) {
$links[] = ''. get_string('edittag', 'tag') .'';
}
$output .= implode(' | ', $links);
$output .= $OUTPUT->box_end();
}
if ($return) {
return $output;
} else {
echo $output;
}
}
/**
* Prints the tag search box
*
* @param bool $return if true return html string
*/
function tag_print_search_box($return=false) {
global $CFG, $OUTPUT;
$output = $OUTPUT->box_start('','tag-search-box');
$output .= '';
$output .= $OUTPUT->box_end();
if ($return) {
return $output;
}
else {
echo $output;
}
}
/**
* Prints the tag search results
*
* @param string $query text that tag names will be matched against
* @param int $page current page
* @param int $perpage nr of users displayed per page
* @param $return if true return html string
*/
function tag_print_search_results($query, $page, $perpage, $return=false) {
global $CFG, $USER, $OUTPUT;
$query = array_shift(tag_normalize($query, TAG_CASE_ORIGINAL));
$count = sizeof(tag_find_tags($query, false));
$tags = array();
if ( $found_tags = tag_find_tags($query, true, $page * $perpage, $perpage) ) {
$tags = array_values($found_tags);
}
$baseurl = $CFG->wwwroot.'/tag/search.php?query='. rawurlencode($query);
$output = '';
// link "Add $query to my interests"
$addtaglink = '';
if( !tag_record_tagged_with('user', $USER->id, $query) ) {
$addtaglink = '';
$addtaglink .= get_string('addtagtomyinterests', 'tag', htmlspecialchars($query)) .'';
}
if ( !empty($tags) ) { // there are results to display!!
$output .= $OUTPUT->heading(get_string('searchresultsfor', 'tag', htmlspecialchars($query)) ." : {$count}", 3, 'main');
//print a link "Add $query to my interests"
if (!empty($addtaglink)) {
$output .= $OUTPUT->box($addtaglink, 'box', 'tag-management-box');
}
$nr_of_lis_per_ul = 6;
$nr_of_uls = ceil( sizeof($tags) / $nr_of_lis_per_ul );
$output .= '';
for($i = 0; $i < $nr_of_uls; $i++) {
$output .= '- ';
foreach (array_slice($tags, $i * $nr_of_lis_per_ul, $nr_of_lis_per_ul) as $tag) {
$tag_link = ' '. tag_display_name($tag) .'';
$output .= '•'. $tag_link .'
';
}
$output .= ' ';
}
$output .= '
';
$output .= '
'; // <-- small layout hack in order to look good in Firefox
$output .= $OUTPUT->paging_bar($count, $page, $perpage, $baseurl);
}
else { //no results were found!!
$output .= $OUTPUT->heading(get_string('noresultsfor', 'tag', htmlspecialchars($query)), 3, 'main');
//print a link "Add $query to my interests"
if (!empty($addtaglink)) {
$output .= $OUTPUT->box($addtaglink, 'box', 'tag-management-box');
}
}
if ($return) {
return $output;
}
else {
echo $output;
}
}
/**
* Prints a table of the users tagged with the tag passed as argument
*
* @param $tag_object
* @param int $users_per_row number of users per row to display
* @param int $limitfrom prints users starting at this point (optional, required if $limitnum is set).
* @param int $limitnum prints this many users (optional, required if $limitfrom is set).
* @param $return if true return html string
*/
function tag_print_tagged_users_table($tag_object, $limitfrom='' , $limitnum='', $return=false) {
//List of users with this tag
$userlist = tag_find_records($tag_object->name, 'user', $limitfrom, $limitnum);
$output = tag_print_user_list($userlist, true);
if ($return) {
return $output;
}
else {
echo $output;
}
}
/**
* Prints an individual user box
*
* @param $user user object (contains the following fields: id, firstname, lastname and picture)
* @param $return if true return html string
*/
function tag_print_user_box($user, $return=false) {
global $CFG, $OUTPUT;
$textlib = textlib_get_instance();
$usercontext = get_context_instance(CONTEXT_USER, $user->id);
$profilelink = '';
if ($usercontext and (has_capability('moodle/user:viewdetails', $usercontext) || has_coursecontact_role($user->id))) {
$profilelink = $CFG->wwwroot .'/user/view.php?id='. $user->id;
}
$output = $OUTPUT->box_start('user-box', 'user'. $user->id);
$fullname = fullname($user);
$alt = '';
if (!empty($profilelink)) {
$output .= '';
$alt = $fullname;
}
$output .= $OUTPUT->user_picture($user, array('size'=>100));
$output .= '
';
if (!empty($profilelink)) {
$output .= '';
}
//truncate name if it's too big
if ($textlib->strlen($fullname) > 26) {
$fullname = $textlib->substr($fullname, 0, 26) .'...';
}
$output .= ''. $fullname .'';
$output .= $OUTPUT->box_end();
if ($return) {
return $output;
}
else {
echo $output;
}
}
/**
* Prints a list of users
*
* @param array $userlist an array of user objects
* @param $return if true return html string
*/
function tag_print_user_list($userlist, $return=false) {
$output = '';
foreach ($userlist as $user){
$output .= '- '. tag_print_user_box($user, true) ."
\n";
}
$output .= "
\n";
if ($return) {
return $output;
}
else {
echo $output;
}
}