From 30a9aff58932c3228c9702790c0be687b08a30dd Mon Sep 17 00:00:00 2001 From: moodler Date: Mon, 8 Sep 2008 05:46:42 +0000 Subject: [PATCH] MDL-14722 Added new maxattachments setting at admin and forum level to 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. --- lang/en_utf8/forum.php | 2 + lang/en_utf8/help/forum/attachment2.html | 13 +++++ lang/en_utf8/help/forum/maxattachments.html | 3 ++ mod/forum/db/upgrade.php | 16 +++++++ mod/forum/lib.php | 53 +++++++++++++-------- mod/forum/mod_form.php | 5 ++ mod/forum/post.php | 31 ++++++++++-- mod/forum/post_form.php | 8 ++-- mod/forum/settings.php | 4 ++ mod/forum/version.php | 4 +- 10 files changed, 111 insertions(+), 28 deletions(-) create mode 100644 lang/en_utf8/help/forum/attachment2.html create mode 100644 lang/en_utf8/help/forum/maxattachments.html diff --git a/lang/en_utf8/forum.php b/lang/en_utf8/forum.php index e5fd92af31..8e9808f4ef 100644 --- a/lang/en_utf8/forum.php +++ b/lang/en_utf8/forum.php @@ -56,6 +56,7 @@ $string['configenabletimedposts'] = 'Set to \'yes\' if you want to allow setting $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.'; @@ -160,6 +161,7 @@ $string['markread'] = 'Mark read'; $string['markreadbutton'] = 'Mark
read'; $string['markunread'] = 'Mark unread'; $string['markunreadbutton'] = 'Mark
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'; diff --git a/lang/en_utf8/help/forum/attachment2.html b/lang/en_utf8/help/forum/attachment2.html new file mode 100644 index 0000000000..dc8e25d422 --- /dev/null +++ b/lang/en_utf8/help/forum/attachment2.html @@ -0,0 +1,13 @@ +

Attachments for posts

+ +

You can optionally attach one or more files (the number depends + on the forum settings) to any post in the forums.

+ +

This can useful when you want to share a picture or a + word processing document, for example.

+ +

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.

diff --git a/lang/en_utf8/help/forum/maxattachments.html b/lang/en_utf8/help/forum/maxattachments.html new file mode 100644 index 0000000000..bbbea77117 --- /dev/null +++ b/lang/en_utf8/help/forum/maxattachments.html @@ -0,0 +1,3 @@ +

Maximum number of attachments

+ +

This setting allows you to control how many attachments are allowed for each post in this forum.

diff --git a/mod/forum/db/upgrade.php b/mod/forum/db/upgrade.php index 64b8e02c3e..d5f13c1dd9 100644 --- a/mod/forum/db/upgrade.php +++ b/mod/forum/db/upgrade.php @@ -166,6 +166,22 @@ function xmldb_forum_upgrade($oldversion) { 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; } diff --git a/mod/forum/lib.php b/mod/forum/lib.php index 3c40fa8bd2..485ea4a8ae 100644 --- a/mod/forum/lib.php +++ b/mod/forum/lib.php @@ -4067,10 +4067,9 @@ function forum_pluginfile($course, $cminfo, $context, $filearea, $args) { * @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; } @@ -4078,29 +4077,43 @@ function forum_add_attachment($post, $cm, $mform=null, &$message=null, $remove_p $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); @@ -4133,8 +4146,8 @@ function forum_add_new_post($post, $mform, &$message) { 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)); @@ -4176,8 +4189,8 @@ function forum_update_post($post, $mform, &$message) { 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); @@ -4210,7 +4223,7 @@ function forum_add_discussion($discussion, $mform=null, &$message=null) { $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; @@ -4239,8 +4252,8 @@ function forum_add_discussion($discussion, $mform=null, &$message=null) { 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); diff --git a/mod/forum/mod_form.php b/mod/forum/mod_form.php index ef67c03b0f..fa5f6f4f74 100644 --- a/mod/forum/mod_form.php +++ b/mod/forum/mod_form.php @@ -54,6 +54,11 @@ class mod_forum_mod_form extends moodleform_mod { $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')); diff --git a/mod/forum/post.php b/mod/forum/post.php index 053b33a494..459f58c513 100644 --- a/mod/forum/post.php +++ b/mod/forum/post.php @@ -441,11 +441,14 @@ } $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)) { @@ -753,6 +756,26 @@ $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, @@ -762,9 +785,11 @@ '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): diff --git a/mod/forum/post_form.php b/mod/forum/post_form.php index c9b05eb2de..d6ee1d58d0 100644 --- a/mod/forum/post_form.php +++ b/mod/forum/post_form.php @@ -52,9 +52,11 @@ class mod_forum_post_form extends moodleform { $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 diff --git a/mod/forum/settings.php b/mod/forum/settings.php index 323b7872f7..6c5b1b2561 100644 --- a/mod/forum/settings.php +++ b/mod/forum/settings.php @@ -23,6 +23,10 @@ $settings->add(new admin_setting_configtext('forum_manydiscussions', get_string( $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)); diff --git a/mod/forum/version.php b/mod/forum/version.php index 0503f290e7..773e8aa8e2 100644 --- a/mod/forum/version.php +++ b/mod/forum/version.php @@ -5,8 +5,8 @@ // 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; ?> -- 2.39.5