set the maximum number of attachments for forum posts. Default: 1.
Works, but still needs a bit of polishing to deal with re-editing posts (to stop people going above maxattachments)
Also fixed documentation for attachments.
$string['configlogblocked'] = 'Forum cron may log blocked attempts to send emails to users with disabled email.';
$string['configlongpost'] = 'Any post over this length (in characters not including HTML) is considered long. Posts displayed on the site front page, social format course pages, or user profiles are shortened to a natural break somewhere between the forum_shortpost and forum_longpost values.';
$string['configmanydiscussions'] = 'Maximum number of discussions shown in a forum per page';
+$string['configmaxattachments'] = 'Default maximum number of attachments allowed per post.';
$string['configmaxbytes'] = 'Default maximum size for all forum attachments on the site (subject to course limits and other local settings)';
$string['configoldpostdays'] = 'Number of days old any post is considered read.';
$string['configreplytouser'] = 'When a forum post is mailed out, should it contain the user\'s email address so that recipients can reply personally rather than via the forum? Even if set to \'Yes\' users can choose in their profile to keep their email address secret.';
$string['markreadbutton'] = 'Mark<br />read';
$string['markunread'] = 'Mark unread';
$string['markunreadbutton'] = 'Mark<br />unread';
+$string['maxattachments'] = 'Maximum attachments';
$string['maxattachmentsize'] = 'Maximum attachment size';
$string['maxtimehaspassed'] = 'Sorry, but the maximum time for editing this post ($a) has passed!';
$string['message'] = 'Message';
--- /dev/null
+<h1>Attachments for posts</h1>
+
+<p>You can optionally attach one or more files (the number depends
+ on the forum settings) to any post in the forums.</p>
+
+<p>This can useful when you want to share a picture or a
+ word processing document, for example.</p>
+
+<p>Your files can be of any type, however it is highly recommended
+ that the file is named using standard 3-letter internet
+ suffixes such as .doc for a Word document, .jpg or .png
+ for an image, and so on. This will make it easier for others
+ to download and view your attachment in their browsers.</p>
--- /dev/null
+<h1>Maximum number of attachments</h1>
+
+<p>This setting allows you to control how many attachments are allowed for each post in this forum.</p>
upgrade_mod_savepoint($result, 2008081900, 'forum');
}
+ if ($result && $oldversion < 2008090800) {
+
+ /// Define field maxattachments to be added to forum
+ $table = new xmldb_table('forum');
+ $field = new xmldb_field('maxattachments', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, '1', 'maxbytes');
+
+ /// Conditionally launch add field maxattachments
+ if (!$dbman->field_exists($table, $field)) {
+ $dbman->add_field($table, $field);
+ }
+
+ /// forum savepoint reached
+ upgrade_mod_savepoint($result, 2008090800, 'forum');
+ }
+
+
return $result;
}
* @param $newfile is a full upload array from $_FILES
* @param $message is a string to hold the messages.
*/
-function forum_add_attachment($post, $cm, $mform=null, &$message=null, $remove_previous=true) {
+function forum_add_attachment($post, $forum, $cm, $mform=null, &$message=null, $remove_previous=true) {
global $CFG, $DB, $USER;
- //TODO: add message when overwriting
if (empty($mform)) {
return false;
}
$filearea = 'forum_attachment';
$fs = get_file_storage();
-
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
- if ($remove_previous) {
+ // The logic here really needs work to handle re-editing properly TODO XXX
+
+ if ($remove_previous) { // Remove ALL previous files for this post
$fs->delete_area_files($context->id, $filearea, $post->id);
- $post->attachment = '';
- $DB->update_record('forum_posts', $post);
+ $post->attachment = 0;
+ $DB->set_field('forum_posts', 'attachment', 0, array('id'=>$post->id)); // Update it now in case we fail later on
}
- if ($mform->save_stored_file('attachment', $context->id, $filearea, $post->id, '/', null, true, $USER->id)) {
- $post->attachment = '1';
- $DB->update_record('forum_posts', $post);
- return true;
+ $values = $mform->get_data();
- } else {
- return false;
+ if (!isset($forum->maxattachments)) { // TODO - delete this once we add a field to the forum table
+ $forum->maxattachments = 3;
+ }
+
+ for ($i=0; $i<$forum->maxattachments; $i++) {
+ $elementname = 'attachment'.$i;
+ if (empty($values->$elementname)) { // Nothing defined
+ continue;
+ }
+ if (!is_numeric($values->$elementname)) { // Pre-existing file reference, skip it
+ continue;
+ }
+ if ($mform->save_stored_file($elementname, $context->id, $filearea, $post->id, '/', null, true, $USER->id)) {
+ $post->attachment = '1';
+ $DB->set_field('forum_posts', 'attachment', 1, array('id'=>$post->id)); // Update it now in case we fail later on
+ } else {
+ return false;
+ }
}
}
/**
* Relinks urls linked to draftfile.php in $post->message.
*/
-function forum_relink_inline_attachments($post, $cm){
+function forum_relink_inline_attachments($post, $forum, $cm){
global $DB;
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
return false;
}
- forum_relink_inline_attachments($post, $cm);
- forum_add_attachment($post, $cm, $mform, $message, false);
+ forum_relink_inline_attachments($post, $forum, $cm);
+ forum_add_attachment($post, $forum, $cm, $mform, $message, false);
// Update discussion modified date
$DB->set_field("forum_discussions", "timemodified", $post->modified, array("id" => $post->discussion));
return false;
}
- forum_relink_inline_attachments($post, $cm);
- forum_add_attachment($post, $cm, $mform, $message, true);
+ forum_relink_inline_attachments($post, $forum, $cm);
+ forum_add_attachment($post, $forum, $cm, $mform, $message, false);
if (forum_tp_can_track_forums($forum) && forum_tp_is_tracked($forum)) {
forum_tp_mark_post_read($post->userid, $post, $post->forum);
$post->mailed = 0;
$post->subject = $discussion->name;
$post->message = $discussion->intro;
- $post->attachment = "";
+ $post->attachment = 0;
$post->forum = $forum->id; // speedup
$post->course = $forum->course; // speedup
$post->format = $discussion->format;
return 0;
}
- forum_relink_inline_attachments($post, $cm);
- forum_add_attachment($post, $cm, $mform, $message, false);
+ forum_relink_inline_attachments($post, $forum, $cm);
+ forum_add_attachment($post, $forum, $cm, $mform, $message, false);
if (forum_tp_can_track_forums($forum) && forum_tp_is_tracked($forum)) {
forum_tp_mark_post_read($post->userid, $post, $post->forum);
$mform->setHelpButton('maxbytes', array('maxattachmentsize', get_string('maxattachmentsize', 'forum'), 'forum'));
$mform->setDefault('maxbytes', $CFG->forum_maxbytes);
+ $choices = array(0,1,2,3,4,5,6,7,8,9);
+ $mform->addElement('select', 'maxattachments', get_string('maxattachments', 'forum'), $choices);
+ $mform->setHelpButton('maxattachments', array('maxattachments', get_string('maxattachments', 'forum'), 'forum'));
+ $mform->setDefault('maxattachments', $CFG->forum_maxattachments);
+
if ($CFG->enablerssfeeds && isset($CFG->forum_enablerssfeeds) && $CFG->forum_enablerssfeeds) {
//-------------------------------------------------------------------------------
$mform->addElement('header', '', get_string('rss'));
}
$modcontext = get_context_instance(CONTEXT_MODULE, $cm->id);
+ if (!isset($forum->maxattachments)) { // TODO - delete this once we add a field to the forum table
+ $forum->maxattachments = 3;
+ }
+
$mform_post = new mod_forum_post_form('post.php', array('course'=>$course, 'cm'=>$cm, 'coursecontext'=>$coursecontext, 'modcontext'=>$modcontext, 'forum'=>$forum, 'post'=>$post));
if ($fromform = $mform_post->get_data()) {
-
require_login($course, false, $cm);
if (empty($SESSION->fromurl)) {
$subscribe = !empty($USER->autosubscribe);
}
+ $defaultattachments = array();
+
+ if ($forum->maxattachments) {
+ for ($i=0; $i<$forum->maxattachments; $i++) {
+ $defaultattachments['attachment'.$i] = '';
+ }
+
+ if (!empty($post->attachment)) { // We already have some attachments, so show them
+ $fs = get_file_storage();
+
+ $i = 0;
+ if ($files = $fs->get_area_files($modcontext->id, 'forum_attachment', $post->id, "timemodified ASC", false)) {
+ foreach ($files as $file) {
+ $defaultattachments['attachment'.$i] = $file->get_filename();
+ $i++;
+ }
+ }
+ }
+ }
+
// HACK ALERT: this is very wrong, the defaults should be always initialized before calling $mform->get_data() !!!
$mform_post->set_data(array( 'general'=>$heading,
'subject'=>$post->subject,
'userid'=>$post->userid,
'parent'=>$post->parent,
'discussion'=>$post->discussion,
- 'course'=>$course->id)+
+ 'course'=>$course->id) +
+
+ $defaultattachments +
- $page_params+
+ $page_params +
(isset($post->format)?array(
'format'=>$post->format):
$mform->setHelpButton('subscribemessage', array('subscription', get_string('subscription', 'forum'), 'forum'));
}
- if ($forum->maxbytes != 1 && has_capability('mod/forum:createattachment', $modcontext)) { // 1 = No attachments at all
- $mform->addElement('filepicker', 'attachment', get_string('attachment', 'forum'));
- $mform->setHelpButton('attachment', array('attachment', get_string('attachment', 'forum'), 'forum'));
+ if (!empty($forum->maxattachments) && $forum->maxbytes != 1 && has_capability('mod/forum:createattachment', $modcontext)) { // 1 = No attachments at all
+ for ($i=0; $i<$forum->maxattachments; $i++) {
+ $mform->addElement('filepicker', 'attachment'.$i, get_string('attachment', 'forum'));
+ $mform->setHelpButton('attachment'.$i, array('attachment2', get_string('attachment', 'forum'), 'forum'));
+ }
}
if (empty($post->id) && has_capability('moodle/course:manageactivities', $coursecontext)) { // hack alert
$settings->add(new admin_setting_configselect('forum_maxbytes', get_string('maxattachmentsize', 'forum'),
get_string('configmaxbytes', 'forum'), 512000, get_max_upload_sizes($CFG->maxbytes)));
+// Default number of attachments allowed per post in all forums
+$settings->add(new admin_setting_configtext('forum_maxattachments', get_string('maxattachments', 'forum'),
+ get_string('configmaxattachments', 'forum'), 1, PARAM_INT));
+
// Default whether user needs to mark a post as read
$settings->add(new admin_setting_configcheckbox('forum_trackreadposts', get_string('trackforum', 'forum'),
get_string('configtrackreadposts', 'forum'), 1));
// This fragment is called by /admin/index.php
////////////////////////////////////////////////////////////////////////////////
-$module->version = 2008081900;
-$module->requires = 2008081600; // Requires this Moodle version
+$module->version = 2008090800;
+$module->requires = 2008090800; // Requires this Moodle version
$module->cron = 60;
?>