moodle/blog/lib.php

698 lines
25 KiB
PHP
Raw Normal View History

2006-03-10 06:53:01 +00:00
<?php //$Id$
/**
* Library of functions and constants for blog
*/
require_once($CFG->libdir .'/blocklib.php');
require_once($CFG->libdir .'/pagelib.php');
require_once($CFG->dirroot .'/blog/rsslib.php');
require_once($CFG->dirroot .'/blog/blogpage.php');
require_once($CFG->dirroot.'/tag/lib.php');
/**
* Definition of blogcourse page type (blog page with course id present).
*/
//not used at the moment, and may not need to be
define('PAGE_BLOG_COURSE_VIEW', 'blog_course-view');
/**
* Checks to see if user has visited blogpages before, if not, install 2
* default blocks (blog_menu and blog_tags).
*/
function blog_check_and_install_blocks() {
global $USER;
if (isloggedin() && !isguest()) {
// if this user has not visited this page before
if (!get_user_preferences('blogpagesize')) {
// find the correct ids for blog_menu and blog_from blocks
$menublock = get_record('block','name','blog_menu');
$tagsblock = get_record('block','name','blog_tags');
// add those 2 into block_instance page
// add blog_menu block
$newblock = new object();
$newblock->blockid = $menublock->id;
$newblock->pageid = $USER->id;
$newblock->pagetype = 'blog-view';
$newblock->position = 'r';
$newblock->weight = 0;
$newblock->visible = 1;
insert_record('block_instance', $newblock);
// add blog_tags menu
$newblock -> blockid = $tagsblock->id;
$newblock -> weight = 1;
insert_record('block_instance', $newblock);
// finally we set the page size pref
set_user_preference('blogpagesize', 10);
}
}
}
/**
* Adaptation of isediting in moodlelib.php for blog module
* @return bool
*/
function blog_isediting() {
global $SESSION;
return !empty($SESSION->blog_editing_enabled);
}
/**
* This function is in lib and not in BlogInfo because entries being searched
* might be found in any number of blogs rather than just one.
*
2006-04-12 08:58:49 +00:00
* $@param ...
*/
function blog_print_html_formatted_entries($postid, $filtertype, $filterselect, $tagid, $tag) {
2006-04-12 08:58:49 +00:00
global $CFG, $USER;
2006-03-10 06:53:01 +00:00
$blogpage = optional_param('blogpage', 0, PARAM_INT);
$bloglimit = optional_param('limit', get_user_preferences('blogpagesize', 10), PARAM_INT);
$start = $blogpage * $bloglimit;
$sitecontext = get_context_instance(CONTEXT_SYSTEM);
2006-03-10 06:53:01 +00:00
$morelink = '<br />&nbsp;&nbsp;';
2006-11-02 05:54:01 +00:00
$totalentries = get_viewable_entry_count($postid, $bloglimit, $start, $filtertype, $filterselect, $tagid, $tag, $sort='lastmodified DESC');
$blogEntries = blog_fetch_entries($postid, $bloglimit, $start, $filtertype, $filterselect, $tagid, $tag, $sort='lastmodified DESC', true);
2006-11-02 05:54:01 +00:00
print_paging_bar($totalentries, $blogpage, $bloglimit, get_baseurl($filtertype, $filterselect), 'blogpage');
if ($CFG->enablerssfeeds) {
blog_rss_print_link($filtertype, $filterselect, $tag);
}
if (has_capability('moodle/blog:create', $sitecontext)) {
//the user's blog is enabled and they are viewing their own blog
2007-02-06 08:24:37 +00:00
$addlink = '<div class="addbloglink">';
$addlink .= '<a href="'.$CFG->wwwroot .'/blog/edit.php?action=add'.'">'. get_string('addnewentry', 'blog').'</a>';
$addlink .= '</div>';
echo $addlink;
2006-03-10 06:53:01 +00:00
}
2006-04-21 02:37:28 +00:00
if ($blogEntries) {
$count = 0;
foreach ($blogEntries as $blogEntry) {
blog_print_entry($blogEntry, 'list', $filtertype, $filterselect); //print this entry.
$count++;
}
2006-11-02 05:54:01 +00:00
print_paging_bar($totalentries, $blogpage, $bloglimit, get_baseurl($filtertype, $filterselect), 'blogpage');
if (!$count) {
2007-02-08 03:04:41 +00:00
print '<br /><div style="text-align:center">'. get_string('noentriesyet', 'blog') .'</div><br />';
}
print $morelink.'<br />'."\n";
return;
2006-03-10 06:53:01 +00:00
}
2007-02-08 03:04:41 +00:00
$output = '<br /><div style="text-align:center">'. get_string('noentriesyet', 'blog') .'</div><br />';
print $output;
2006-11-02 05:54:01 +00:00
2006-03-10 06:53:01 +00:00
}
/**
* This function is in lib and not in BlogInfo because entries being searched
* might be found in any number of blogs rather than just one.
*
* This function builds an array which can be used by the included
* template file, making predefined and nicely formatted variables available
* to the template. Template creators will not need to become intimate
* with the internal objects and vars of moodle blog nor will they need to worry
* about properly formatting their data
*
* @param BlogEntry blogEntry - a hopefully fully populated BlogEntry object
* @param string viewtype Default is 'full'. If 'full' then display this blog entry
* in its complete form (eg. archive page). If anything other than 'full'
* display the entry in its abbreviated format (eg. index page)
*/
function blog_print_entry($blogEntry, $viewtype='full', $filtertype='', $filterselect='', $mode='loud') {
global $USER, $CFG, $COURSE, $ME;
$template['body'] = format_text($blogEntry->summary, $blogEntry->format);
2007-02-06 08:24:37 +00:00
//$template['title'] = '<a name="'. $blogEntry->subject .'"></a>';
//enclose the title in nolink tags so that moodle formatting doesn't autolink the text
2007-02-06 08:24:37 +00:00
$template['title'] = '<span class="nolink">'.$blogEntry->subject.'</span>';
$template['userid'] = $blogEntry->userid;
$template['author'] = fullname(get_record('user','id',$blogEntry->userid));
$template['lastmod'] = userdate($blogEntry->lastmodified);
$template['created'] = userdate($blogEntry->created);
$template['publishstate'] = $blogEntry->publishstate;
2006-04-12 03:02:53 +00:00
/// preventing user to browse blogs that they aren't supposed to see
2006-04-12 08:58:49 +00:00
/// This might not be too good since there are multiple calls per page
/*
2006-04-12 03:02:53 +00:00
if (!blog_user_can_view_user_post($template['userid'])) {
error ('you can not view this post');
2006-04-12 08:58:49 +00:00
}*/
$stredit = get_string('edit');
$strdelete = get_string('delete');
2006-03-10 06:53:01 +00:00
$user = get_record('user','id',$template['userid']);
2006-03-10 06:53:01 +00:00
/// Start printing of the blog
2006-04-24 03:36:02 +00:00
echo '<table cellspacing="0" class="forumpost blogpost blog'.$template['publishstate'].'" width="100%">';
2006-03-10 06:53:01 +00:00
echo '<tr class="header"><td class="picture left">';
print_user_picture($user, SITEID, $user->picture);
echo '</td>';
2006-03-10 06:53:01 +00:00
echo '<td class="topic starter"><div class="subject">'.$template['title'].'</div><div class="author">';
$fullname = fullname($user, $template['userid']);
$by = new object();
$by->name = '<a href="'.$CFG->wwwroot.'/user/view.php?id='.
$user->id.'&amp;course='.$COURSE->id.'">'.$fullname.'</a>';
$by->date = $template['lastmod'];
print_string('bynameondate', 'forum', $by);
echo '</div></td></tr>';
2006-03-10 06:53:01 +00:00
echo '<tr><td class="left side">';
2006-03-10 06:53:01 +00:00
/// Actual content
2006-03-10 06:53:01 +00:00
echo '</td><td class="content">'."\n";
2006-11-20 08:31:48 +00:00
if ($blogEntry->attachment) {
echo '<div class="attachments">';
$attachedimages = blog_print_attachments($blogEntry);
echo '</div>';
} else {
$attachedimages = '';
}
2006-03-10 06:53:01 +00:00
2006-04-18 01:59:13 +00:00
switch ($template['publishstate']) {
case 'draft':
$blogtype = get_string('publishtonoone', 'blog');
break;
case 'site':
$blogtype = get_string('publishtosite', 'blog');
break;
case 'public':
$blogtype = get_string('publishtoworld', 'blog');
break;
default:
2006-05-01 03:12:17 +00:00
$blogtype = '';
2006-04-18 01:59:13 +00:00
break;
}
2006-04-18 01:59:13 +00:00
echo '<div class="audience">'.$blogtype.'</div>';
2006-04-18 01:59:13 +00:00
// Print whole message
echo format_text($template['body']);
2006-11-20 08:31:48 +00:00
/// Print attachments
echo $attachedimages;
/// Links to tags
if ( !empty($CFG->usetags) && ($blogtags = tag_get_tags_csv('post', $blogEntry->id)) ) {
2006-05-01 03:12:17 +00:00
echo '<div class="tags">';
if ($blogtags) {
print(get_string('tags', 'tag') .': '. $blogtags);
}
2006-05-01 03:12:17 +00:00
echo '</div>';
2008-02-21 01:50:44 +00:00
}
2006-03-10 06:53:01 +00:00
/// Commands
2006-03-10 06:53:01 +00:00
echo '<div class="commands">';
2006-03-10 06:53:01 +00:00
if (blog_user_can_edit_post($blogEntry)) {
echo '<a href="'.$CFG->wwwroot.'/blog/edit.php?action=edit&amp;id='.$blogEntry->id.'">'.$stredit.'</a>';
echo '| <a href="'.$CFG->wwwroot.'/blog/edit.php?action=delete&amp;id='.$blogEntry->id.'">'.$strdelete.'</a> | ';
2006-03-10 06:53:01 +00:00
}
echo '<a href="'.$CFG->wwwroot.'/blog/index.php?postid='.$blogEntry->id.'">'.get_string('permalink', 'blog').'</a>';
echo '</div>';
2006-04-24 03:36:02 +00:00
echo '</td></tr></table>'."\n\n";
2006-03-10 06:53:01 +00:00
}
2006-11-20 08:31:48 +00:00
function blog_file_area_name($blogentry) {
// Creates a directory file name, suitable for make_upload_directory()
global $CFG;
// $CFG->dataroot/blog/attachments/xxxx/file.jpg
return "blog/attachments/$blogentry->id";
}
2006-03-10 06:53:01 +00:00
2006-11-20 08:31:48 +00:00
function blog_file_area($blogentry) {
return make_upload_directory( blog_file_area_name($blogentry) );
}
function blog_delete_old_attachments($post, $exception="") {
// Deletes all the user files in the attachments area for a post
// EXCEPT for any file named $exception
if ($basedir = blog_file_area($post)) {
if ($files = get_directory_list($basedir)) {
foreach ($files as $file) {
if ($file != $exception) {
unlink("$basedir/$file");
notify("Existing file '$file' has been deleted!");
}
}
}
if (!$exception) { // Delete directory as well, if empty
rmdir("$basedir");
}
}
}
2006-11-20 08:31:48 +00:00
function blog_print_attachments($blogentry, $return=NULL) {
// if return=html, then return a html string.
// if return=text, then return a text-only string.
// otherwise, print HTML for non-images, and return image HTML
global $CFG;
$filearea = blog_file_area_name($blogentry);
$imagereturn = "";
$output = "";
if ($basedir = blog_file_area($blogentry)) {
if ($files = get_directory_list($basedir)) {
$strattachment = get_string("attachment", "forum");
foreach ($files as $file) {
include_once($CFG->libdir.'/filelib.php');
$icon = mimeinfo("icon", $file);
$type = mimeinfo("type", $file);
2006-11-20 08:31:48 +00:00
if ($CFG->slasharguments) {
$ffurl = "$CFG->wwwroot/file.php/$filearea/$file";
} else {
$ffurl = "$CFG->wwwroot/file.php?file=/$filearea/$file";
}
$image = "<img src=\"$CFG->pixpath/f/$icon\" class=\"icon\" alt=\"\" />";
2006-11-20 08:31:48 +00:00
if ($return == "html") {
$output .= "<a href=\"$ffurl\">$image</a> ";
$output .= "<a href=\"$ffurl\">$file</a><br />";
} else if ($return == "text") {
$output .= "$strattachment $file:\n$ffurl\n";
} else {
if (in_array($type, array('image/gif', 'image/jpeg', 'image/png'))) { // Image attachments don't get printed as links
2006-11-20 08:31:48 +00:00
$imagereturn .= "<br /><img src=\"$ffurl\" alt=\"\" />";
} else {
echo "<a href=\"$ffurl\">$image</a> ";
echo filter_text("<a href=\"$ffurl\">$file</a><br />");
}
}
}
}
}
if ($return) {
return $output;
}
return $imagereturn;
}
/**
* Use this function to retrieve a list of publish states available for
* the currently logged in user.
*
* @return array This function returns an array ideal for sending to moodles'
* choose_from_menu function.
*/
function blog_applicable_publish_states($courseid='') {
2006-04-12 08:58:49 +00:00
global $CFG;
// everyone gets draft access
if ($CFG->bloglevel >= BLOG_USER_LEVEL) {
$options = array ( 'draft' => get_string('publishtonoone', 'blog') );
}
if ($CFG->bloglevel > BLOG_USER_LEVEL) {
$options['site'] = get_string('publishtosite', 'blog');
}
if ($CFG->bloglevel >= BLOG_GLOBAL_LEVEL) {
$options['public'] = get_string('publishtoworld', 'blog');
}
return $options;
}
2006-04-12 08:58:49 +00:00
/**
* User can edit a blog entry if this is their own blog post and they have
* the capability moodle/blog:create, or if they have the capability
* moodle/blog:manageentries.
*
* This also applies to deleting of posts.
*/
function blog_user_can_edit_post($blogEntry) {
2006-04-12 08:58:49 +00:00
global $CFG, $USER;
$sitecontext = get_context_instance(CONTEXT_SYSTEM);
if (has_capability('moodle/blog:manageentries', $sitecontext)) {
return true; // can edit any blog post
}
if ($blogEntry->userid == $USER->id
and has_capability('moodle/blog:create', $sitecontext)) {
return true; // can edit own when having blog:create capability
}
return false;
2006-04-12 08:58:49 +00:00
}
2006-03-10 06:53:01 +00:00
/**
* Checks to see if a user can view the blogs of another user.
* Only blog level is checked here, the capabilities are enforced
* in blog/index.php
*/
function blog_user_can_view_user_post($targetuserid, $blogEntry=null) {
global $CFG, $USER;
if (empty($CFG->bloglevel)) {
return false; // blog system disabled
2006-04-12 08:58:49 +00:00
}
if (!empty($USER->id) and $USER->id == $targetuserid) {
return true; // can view own posts in any case
2006-04-12 08:58:49 +00:00
}
$sitecontext = get_context_instance(CONTEXT_SYSTEM);
if (has_capability('moodle/blog:manageentries', $sitecontext)) {
return true; // can manage all posts
}
// coming for 1 post, make sure it's not a draft
if ($blogEntry and $blogEntry->publishstate == 'draft') {
return false; // can not view draft of others
2006-03-10 06:53:01 +00:00
}
// coming for 1 post, make sure user is logged in, if not a public blog
if ($blogEntry && $blogEntry->publishstate != 'public' && !isloggedin()) {
return false;
}
switch ($CFG->bloglevel) {
case BLOG_GLOBAL_LEVEL:
return true;
break;
2006-03-10 06:53:01 +00:00
case BLOG_SITE_LEVEL:
if (!empty($USER->id)) { // not logged in viewers forbidden
return true;
}
return false;
break;
case BLOG_COURSE_LEVEL:
$mycourses = array_keys(get_my_courses($USER->id));
$usercourses = array_keys(get_my_courses($targetuserid));
$shared = array_intersect($mycourses, $usercourses);
if (!empty($shared)) {
return true;
}
return false;
break;
case BLOG_GROUP_LEVEL:
$mycourses = array_keys(get_my_courses($USER->id));
$usercourses = array_keys(get_my_courses($targetuserid));
$shared = array_intersect($mycourses, $usercourses);
foreach ($shared as $courseid) {
$course = get_record('course', 'id', $courseid);
$coursecontext = get_context_instance(CONTEXT_COURSE, $courseid);
if (has_capability('moodle/site:accessallgroups', $coursecontext)
or groups_get_course_groupmode($course) != SEPARATEGROUPS) {
return true;
} else {
if ($usergroups = groups_get_all_groups($courseid, $targetuserid)) {
foreach ($usergroups as $usergroup) {
if (groups_is_member($usergroup->id)) {
return true;
}
}
}
}
}
return false;
break;
case BLOG_USER_LEVEL:
default:
$personalcontext = get_context_instance(CONTEXT_USER, $targetuserid);
return has_capability('moodle/user:readuserblogs', $personalcontext);
break;
2006-03-10 06:53:01 +00:00
}
}
2006-03-10 06:53:01 +00:00
/**
* Main filter function.
*/
function blog_fetch_entries($postid='', $fetchlimit=10, $fetchstart='', $filtertype='', $filterselect='', $tagid='', $tag ='', $sort='lastmodified DESC', $limit=true) {
global $CFG, $USER;
/// the post table will be used for other things too
$typesql = " AND p.module = 'blog' ";
/// set the tag id for searching
if ($tagid) {
$tag = $tagid;
} else if ($tag) {
if ($tagrec = get_record_sql('SELECT * FROM '.$CFG->prefix.'tag WHERE name LIKE "'.$tag.'"')) {
$tag = $tagrec->id;
} else {
$tag = -1; //no records found
2006-03-17 07:38:08 +00:00
}
}
// If we have specified an ID
// Just return 1 entry
2006-05-01 05:33:47 +00:00
if ($postid) {
if ($post = get_record('post', 'id', $postid)) {
if (blog_user_can_view_user_post($post->userid, $post)) {
if ($user = get_record('user', 'id', $post->userid)) {
$post->email = $user->email;
$post->firstname = $user->firstname;
$post->lastname = $user->lastname;
}
$retarray[] = $post;
return $retarray;
} else {
return null;
}
2006-05-01 05:33:47 +00:00
} else { // bad postid
return null;
}
}
if ($tag) {
$tagtablesql = $CFG->prefix.'tag_instance ti, ';
2008-02-21 01:50:44 +00:00
$tagquerysql = ' AND ti.itemid = p.id AND ti.tagid = '.$tag.' AND ti.itemtype = \'post\' ';
2006-03-17 07:38:08 +00:00
} else {
$tagtablesql = '';
$tagquerysql = '';
}
if (isloggedin() && !has_capability('moodle/legacy:guest', get_context_instance(CONTEXT_SYSTEM), $USER->id, false)) {
2007-04-05 06:00:10 +00:00
$permissionsql = 'AND (p.publishstate = \'site\' OR p.publishstate = \'public\' OR p.userid = '.$USER->id.')';
2006-11-03 08:43:54 +00:00
} else {
2007-04-05 06:00:10 +00:00
$permissionsql = 'AND p.publishstate = \'public\'';
}
2007-04-05 06:00:10 +00:00
// fix for MDL-9165, use with readuserblogs capability in a user context can read that user's private blogs
// admins can see all blogs regardless of publish states, as described on the help page
if (has_capability('moodle/user:readuserblogs', get_context_instance(CONTEXT_SYSTEM))) {
$permissionsql = '';
2007-04-05 06:00:10 +00:00
} else if ($filtertype=='user' && has_capability('moodle/user:readuserblogs', get_context_instance(CONTEXT_USER, $filterselect))) {
$permissionsql = '';
2006-11-03 08:43:54 +00:00
}
/****************************************
* depending on the type, there are 4 *
* different possible sqls *
****************************************/
$requiredfields = 'p.*, u.firstname,u.lastname,u.email';
2006-11-03 08:43:54 +00:00
if ($filtertype == 'course' && $filterselect == SITEID) { // Really a site
$filtertype = 'site';
}
switch ($filtertype) {
case 'site':
2006-11-03 08:43:54 +00:00
$SQL = 'SELECT '.$requiredfields.' FROM '.$CFG->prefix.'post p, '.$tagtablesql
.$CFG->prefix.'user u
WHERE p.userid = u.id '.$tagquerysql.'
AND u.deleted = 0
2007-04-05 06:00:10 +00:00
'.$permissionsql.$typesql;
break;
case 'course':
2006-11-03 08:43:54 +00:00
// all users with a role assigned
$context = get_context_instance(CONTEXT_COURSE, $filterselect);
// MDL-10037, hidden users' blogs should not appear
if (has_capability('moodle/role:viewhiddenassigns', $context)) {
$hiddensql = '';
} else {
$hiddensql = ' AND ra.hidden = 0 ';
}
2006-11-03 08:43:54 +00:00
$SQL = 'SELECT '.$requiredfields.' FROM '.$CFG->prefix.'post p, '.$tagtablesql
.$CFG->prefix.'role_assignments ra, '.$CFG->prefix.'user u
WHERE p.userid = ra.userid '.$tagquerysql.'
AND ra.contextid '.get_related_contexts_string($context).'
AND u.id = p.userid
AND u.deleted = 0
'.$hiddensql.$permissionsql.$typesql;
break;
case 'group':
2006-09-20 20:31:09 +00:00
$SQL = 'SELECT '.$requiredfields.' FROM '.$CFG->prefix.'post p, '.$tagtablesql
.$CFG->prefix.'groups_members gm, '.$CFG->prefix.'user u
WHERE p.userid = gm.userid AND u.id = p.userid '.$tagquerysql.'
AND gm.groupid = '.$filterselect.'
AND u.deleted = 0
'.$permissionsql.$typesql;
break;
case 'user':
2006-11-03 08:43:54 +00:00
$SQL = 'SELECT '.$requiredfields.' FROM '.$CFG->prefix.'post p, '.$tagtablesql
.$CFG->prefix.'user u
WHERE p.userid = u.id '.$tagquerysql.'
AND u.id = '.$filterselect.'
AND u.deleted = 0
2007-04-05 06:00:10 +00:00
'.$permissionsql.$typesql;
break;
}
$limitfrom = 0;
$limitnum = 0;
if ($fetchstart !== '' && $limit) {
$limitfrom = $fetchstart;
$limitnum = $fetchlimit;
2006-03-17 07:38:08 +00:00
}
$orderby = ' ORDER BY '. $sort .' ';
$records = get_records_sql($SQL . $orderby, $limitfrom, $limitnum);
if (empty($records)) {
return array();
}
return $records;
2006-03-17 07:38:08 +00:00
}
/**
* get the count of viewable entries, easiest way is to count blog_fetch_entries
* this is used for print_paging_bar
* this is not ideal, but because of the UNION in the sql in blog_fetch_entries,
2006-04-12 08:58:49 +00:00
* it is hard to use count_records_sql
*/
function get_viewable_entry_count($postid='', $fetchlimit=10,
$fetchstart='', $filtertype='', $filterselect='', $tagid='',
$tag ='', $sort='lastmodified DESC') {
$blogEntries = blog_fetch_entries($postid, $fetchlimit,
$fetchstart, $filtertype, $filterselect, $tagid, $tag,
$sort='lastmodified DESC', false);
return count($blogEntries);
2006-03-17 07:38:08 +00:00
}
2006-04-12 08:58:49 +00:00
/// Find the base url from $_GET variables, for print_paging_bar
function get_baseurl($filtertype, $filterselect) {
$getcopy = $_GET;
unset($getcopy['blogpage']);
$strippedurl = strip_querystring(qualified_me());
if(!empty($getcopy)) {
$first = false;
$querystring = '';
foreach($getcopy as $var => $val) {
if(!$first) {
$first = true;
if ($var != 'filterselect' && $var != 'filtertype') {
$querystring .= '?'.$var.'='.$val;
$hasparam = true;
} else {
$querystring .= '?';
}
} else {
if ($var != 'filterselect' && $var != 'filtertype') {
$querystring .= '&amp;'.$var.'='.$val;
$hasparam = true;
}
}
}
if (isset($hasparam)) {
$querystring .= '&amp;';
} else {
$querystring = '?';
}
} else {
$querystring = '?';
}
2006-03-17 07:38:08 +00:00
return strip_querystring(qualified_me()) . $querystring. 'filtertype='.
$filtertype.'&amp;filterselect='.$filterselect.'&amp;';
}
/**
* Returns a list of all user ids who have used blogs in the site
* Used in backup of site courses.
*/
function blog_get_participants() {
global $CFG;
return get_records_sql("SELECT userid as id
FROM {$CFG->prefix}post
WHERE module = 'blog'
AND courseid = 0");
}
?>