Commit a0418089 authored by Andrew Nicols's avatar Andrew Nicols
Browse files

Merge branch 'MDL-372-int-master' of git://github.com/ryanwyllie/moodle

parents 75e7c855 f9621c56
...@@ -93,7 +93,8 @@ class block_news_items extends block_base { ...@@ -93,7 +93,8 @@ class block_news_items extends block_base {
// descending order. The call to default sort order here will use // descending order. The call to default sort order here will use
// that unless the discussion that post is in has a timestart set // that unless the discussion that post is in has a timestart set
// in the future. // in the future.
$sort = forum_get_default_sort_order(true, 'p.modified'); // This sort will ignore pinned posts as we want the most recent.
$sort = forum_get_default_sort_order(true, 'p.modified', 'd', false);
if (! $discussions = forum_get_discussions($cm, $sort, false, if (! $discussions = forum_get_discussions($cm, $sort, false,
$currentgroup, $this->page->course->newsitems) ) { $currentgroup, $this->page->course->newsitems) ) {
$text .= '('.get_string('nonews', 'forum').')'; $text .= '('.get_string('nonews', 'forum').')';
......
...@@ -51,7 +51,7 @@ class backup_forum_activity_structure_step extends backup_activity_structure_ste ...@@ -51,7 +51,7 @@ class backup_forum_activity_structure_step extends backup_activity_structure_ste
$discussion = new backup_nested_element('discussion', array('id'), array( $discussion = new backup_nested_element('discussion', array('id'), array(
'name', 'firstpost', 'userid', 'groupid', 'name', 'firstpost', 'userid', 'groupid',
'assessed', 'timemodified', 'usermodified', 'timestart', 'assessed', 'timemodified', 'usermodified', 'timestart',
'timeend')); 'timeend', 'pinned'));
$posts = new backup_nested_element('posts'); $posts = new backup_nested_element('posts');
......
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* The mod_forum discussion pinned event.
*
* @package mod_forum
* @copyright 2014 Charles Fulton <fultonc@lafayette.edu>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_forum\event;
defined('MOODLE_INTERNAL') || die();
/**
* The mod_forum discussion pinned event.
*
* @package mod_forum
* @copyright 2014 Charles Fulton <fultonc@lafayette.edu>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class discussion_pinned extends \core\event\base {
/**
* Init method.
*
* @return void
*/
protected function init() {
$this->data['crud'] = 'u';
$this->data['edulevel'] = self::LEVEL_OTHER;
$this->data['objecttable'] = 'forum_discussions';
}
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The user {$this->userid} has pinned the discussion {$this->objectid} in the forum {$this->other['forumid']}";
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventdiscussionpinned', 'mod_forum');
}
/**
* Get URL related to the action
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/mod/forum/discuss.php', array('d' => $this->objectid));
}
/**
* Return the legacy event log data.
*
* @return array|null
*/
protected function get_legacy_logdata() {
// The legacy log table expects a relative path to /mod/forum/.
$logurl = substr($this->get_url()->out_as_local_url(), strlen('/mod/forum/'));
return array($this->courseid, 'forum', 'pin discussion', $logurl, $this->objectid, $this->contextinstanceid);
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['forumid'])) {
throw new \coding_exception('forumid must be set in $other.');
}
if ($this->contextlevel != CONTEXT_MODULE) {
throw new \coding_exception('Context passed must be module context.');
}
if (!isset($this->objectid)) {
throw new \coding_exception('objectid must be set to the discussionid.');
}
}
/**
* Forum discussion object id mappings.
*
* @return array
*/
public static function get_objectid_mapping() {
return array('db' => 'forum_discussions', 'restore' => 'forum_discussion');
}
/**
* Forum id mappings.
*
* @return array
*/
public static function get_other_mapping() {
$othermapped = array();
$othermapped['forumid'] = array('db' => 'forum', 'restore' => 'forum');
return $othermapped;
}
}
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* The mod_forum discussion unpinned event.
*
* @package mod_forum
* @copyright 2014 Charles Fulton <fultonc@lafayette.edu>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace mod_forum\event;
defined('MOODLE_INTERNAL') || die();
/**
* The mod_forum discussion unpinned event.
*
* @package mod_forum
* @copyright 2014 Charles Fulton <fultonc@lafayette.edu>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class discussion_unpinned extends \core\event\base {
/**
* Init method.
*
* @return void
*/
protected function init() {
$this->data['crud'] = 'u';
$this->data['edulevel'] = self::LEVEL_OTHER;
$this->data['objecttable'] = 'forum_discussions';
}
/**
* Returns description of what happened.
*
* @return string
*/
public function get_description() {
return "The user {$this->userid} has unpinned the discussion {$this->objectid} in the forum {$this->other['forumid']}";
}
/**
* Return localised event name.
*
* @return string
*/
public static function get_name() {
return get_string('eventdiscussionunpinned', 'mod_forum');
}
/**
* Get URL related to the action
*
* @return \moodle_url
*/
public function get_url() {
return new \moodle_url('/mod/forum/discuss.php', array('d' => $this->objectid));
}
/**
* Return the legacy event log data.
*
* @return array|null
*/
protected function get_legacy_logdata() {
// The legacy log table expects a relative path to /mod/forum/.
$logurl = substr($this->get_url()->out_as_local_url(), strlen('/mod/forum/'));
return array($this->courseid, 'forum', 'unpin discussion', $logurl, $this->objectid, $this->contextinstanceid);
}
/**
* Custom validation.
*
* @throws \coding_exception
* @return void
*/
protected function validate_data() {
parent::validate_data();
if (!isset($this->other['forumid'])) {
throw new \coding_exception('forumid must be set in $other.');
}
if ($this->contextlevel != CONTEXT_MODULE) {
throw new \coding_exception('Context passed must be module context.');
}
if (!isset($this->objectid)) {
throw new \coding_exception('objectid must be set to the discussionid.');
}
}
/**
* Forum discussion object id mappings.
*
* @return array
*/
public static function get_objectid_mapping() {
return array('db' => 'forum_discussions', 'restore' => 'forum_discussion');
}
/**
* Forum id mappings.
*
* @return array
*/
public static function get_other_mapping() {
$othermapped = array();
$othermapped['forumid'] = array('db' => 'forum', 'restore' => 'forum');
return $othermapped;
}
}
...@@ -138,6 +138,11 @@ class mod_forum_post_form extends moodleform { ...@@ -138,6 +138,11 @@ class mod_forum_post_form extends moodleform {
$mform->addHelpButton('attachments', 'attachment', 'forum'); $mform->addHelpButton('attachments', 'attachment', 'forum');
} }
if (!$post->parent && has_capability('mod/forum:pindiscussions', $modcontext)) {
$mform->addElement('checkbox', 'pinned', get_string('discussionpinned', 'forum'));
$mform->addHelpButton('pinned', 'discussionpinned', 'forum');
}
if (empty($post->id) && $manageactivities) { if (empty($post->id) && $manageactivities) {
$mform->addElement('checkbox', 'mailnow', get_string('mailnow', 'forum')); $mform->addElement('checkbox', 'mailnow', get_string('mailnow', 'forum'));
} }
......
...@@ -224,6 +224,17 @@ $capabilities = array( ...@@ -224,6 +224,17 @@ $capabilities = array(
) )
), ),
'mod/forum:pindiscussions' => array(
'captype' => 'write',
'contextlevel' => CONTEXT_MODULE,
'archetypes' => array(
'teacher' => CAP_ALLOW,
'editingteacher' => CAP_ALLOW,
'manager' => CAP_ALLOW
)
),
'mod/forum:editanypost' => array( 'mod/forum:editanypost' => array(
'riskbitmask' => RISK_SPAM, 'riskbitmask' => RISK_SPAM,
......
<?xml version="1.0" encoding="UTF-8" ?> <?xml version="1.0" encoding="UTF-8" ?>
<XMLDB PATH="mod/forum/db" VERSION="20141028" COMMENT="XMLDB file for Moodle mod/forum" <XMLDB PATH="mod/forum/db" VERSION="20160113" COMMENT="XMLDB file for Moodle mod/forum"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd" xsi:noNamespaceSchemaLocation="../../../lib/xmldb/xmldb.xsd"
> >
...@@ -52,6 +52,7 @@ ...@@ -52,6 +52,7 @@
<FIELD NAME="usermodified" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/> <FIELD NAME="usermodified" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
<FIELD NAME="timestart" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/> <FIELD NAME="timestart" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
<FIELD NAME="timeend" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/> <FIELD NAME="timeend" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
<FIELD NAME="pinned" TYPE="int" LENGTH="1" NOTNULL="true" DEFAULT="0" SEQUENCE="false"/>
</FIELDS> </FIELDS>
<KEYS> <KEYS>
<KEY NAME="primary" TYPE="primary" FIELDS="id"/> <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
......
...@@ -26,19 +26,22 @@ ...@@ -26,19 +26,22 @@
defined('MOODLE_INTERNAL') || die(); defined('MOODLE_INTERNAL') || die();
global $DB; // TODO: this is a hack, we should really do something with the SQL in SQL tables global $DB; // TODO: this is a hack, we should really do something with the SQL in SQL tables.
$logs = array( $logs = array(
array('module'=>'forum', 'action'=>'add', 'mtable'=>'forum', 'field'=>'name'), array('module' => 'forum', 'action' => 'add', 'mtable' => 'forum', 'field' => 'name'),
array('module'=>'forum', 'action'=>'update', 'mtable'=>'forum', 'field'=>'name'), array('module' => 'forum', 'action' => 'update', 'mtable' => 'forum', 'field' => 'name'),
array('module'=>'forum', 'action'=>'add discussion', 'mtable'=>'forum_discussions', 'field'=>'name'), array('module' => 'forum', 'action' => 'add discussion', 'mtable' => 'forum_discussions', 'field' => 'name'),
array('module'=>'forum', 'action'=>'add post', 'mtable'=>'forum_posts', 'field'=>'subject'), array('module' => 'forum', 'action' => 'add post', 'mtable' => 'forum_posts', 'field' => 'subject'),
array('module'=>'forum', 'action'=>'update post', 'mtable'=>'forum_posts', 'field'=>'subject'), array('module' => 'forum', 'action' => 'update post', 'mtable' => 'forum_posts', 'field' => 'subject'),
array('module'=>'forum', 'action'=>'user report', 'mtable'=>'user', 'field'=>$DB->sql_concat('firstname', "' '" , 'lastname')), array('module' => 'forum', 'action' => 'user report', 'mtable' => 'user',
array('module'=>'forum', 'action'=>'move discussion', 'mtable'=>'forum_discussions', 'field'=>'name'), 'field' => $DB->sql_concat('firstname', "' '", 'lastname')),
array('module'=>'forum', 'action'=>'view subscribers', 'mtable'=>'forum', 'field'=>'name'), array('module' => 'forum', 'action' => 'move discussion', 'mtable' => 'forum_discussions', 'field' => 'name'),
array('module'=>'forum', 'action'=>'view discussion', 'mtable'=>'forum_discussions', 'field'=>'name'), array('module' => 'forum', 'action' => 'view subscribers', 'mtable' => 'forum', 'field' => 'name'),
array('module'=>'forum', 'action'=>'view forum', 'mtable'=>'forum', 'field'=>'name'), array('module' => 'forum', 'action' => 'view discussion', 'mtable' => 'forum_discussions', 'field' => 'name'),
array('module'=>'forum', 'action'=>'subscribe', 'mtable'=>'forum', 'field'=>'name'), array('module' => 'forum', 'action' => 'view forum', 'mtable' => 'forum', 'field' => 'name'),
array('module'=>'forum', 'action'=>'unsubscribe', 'mtable'=>'forum', 'field'=>'name'), array('module' => 'forum', 'action' => 'subscribe', 'mtable' => 'forum', 'field' => 'name'),
array('module' => 'forum', 'action' => 'unsubscribe', 'mtable' => 'forum', 'field' => 'name'),
array('module' => 'forum', 'action' => 'pin discussion', 'mtable' => 'forum_discussions', 'field' => 'name'),
array('module' => 'forum', 'action' => 'unpin discussion', 'mtable' => 'forum_discussions', 'field' => 'name'),
); );
\ No newline at end of file
...@@ -253,5 +253,18 @@ function xmldb_forum_upgrade($oldversion) { ...@@ -253,5 +253,18 @@ function xmldb_forum_upgrade($oldversion) {
// Moodle v3.0.0 release upgrade line. // Moodle v3.0.0 release upgrade line.
// Put any upgrade step following this. // Put any upgrade step following this.
if ($oldversion < 2015120800) {
// Add support for pinned discussions.
$table = new xmldb_table('forum_discussions');
$field = new xmldb_field('pinned', XMLDB_TYPE_INTEGER, '1', null, XMLDB_NOTNULL, null, '0', 'timeend');
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Forum savepoint reached.
upgrade_mod_savepoint(true, 2015120800, 'forum');
}
return true; return true;
} }
...@@ -32,6 +32,7 @@ $mode = optional_param('mode', 0, PARAM_INT); // If set, changes the ...@@ -32,6 +32,7 @@ $mode = optional_param('mode', 0, PARAM_INT); // If set, changes the
$move = optional_param('move', 0, PARAM_INT); // If set, moves this discussion to another forum $move = optional_param('move', 0, PARAM_INT); // If set, moves this discussion to another forum
$mark = optional_param('mark', '', PARAM_ALPHA); // Used for tracking read posts if user initiated. $mark = optional_param('mark', '', PARAM_ALPHA); // Used for tracking read posts if user initiated.
$postid = optional_param('postid', 0, PARAM_INT); // Used for tracking read posts if user initiated. $postid = optional_param('postid', 0, PARAM_INT); // Used for tracking read posts if user initiated.
$pin = optional_param('pin', -1, PARAM_INT); // If set, pin or unpin this discussion.
$url = new moodle_url('/mod/forum/discuss.php', array('d'=>$d)); $url = new moodle_url('/mod/forum/discuss.php', array('d'=>$d));
if ($parent !== 0) { if ($parent !== 0) {
...@@ -171,6 +172,28 @@ if ($move > 0 and confirm_sesskey()) { ...@@ -171,6 +172,28 @@ if ($move > 0 and confirm_sesskey()) {
redirect($return.'&move=-1&sesskey='.sesskey()); redirect($return.'&move=-1&sesskey='.sesskey());
} }
// Pin or unpin discussion if requested.
if ($pin !== -1 && confirm_sesskey()) {
require_capability('mod/forum:pindiscussions', $modcontext);
$params = array('context' => $modcontext, 'objectid' => $discussion->id, 'other' => array('forumid' => $forum->id));
switch ($pin) {
case FORUM_DISCUSSION_PINNED:
// Pin the discussion and trigger discussion pinned event.
forum_discussion_pin($modcontext, $forum, $discussion);
break;
case FORUM_DISCUSSION_UNPINNED:
// Unpin the discussion and trigger discussion unpinned event.
forum_discussion_unpin($modcontext, $forum, $discussion);
break;
default:
echo $OUTPUT->notification("Invalid value when attempting to pin/unpin discussion");
break;
}
redirect(new moodle_url('/mod/forum/discuss.php', array('d' => $discussion->id)));
}
// Trigger discussion viewed event. // Trigger discussion viewed event.
forum_discussion_view($modcontext, $forum, $discussion); forum_discussion_view($modcontext, $forum, $discussion);
...@@ -271,7 +294,7 @@ $neighbourlinks = $renderer->neighbouring_discussion_navigation($neighbours['pre ...@@ -271,7 +294,7 @@ $neighbourlinks = $renderer->neighbouring_discussion_navigation($neighbours['pre
echo $neighbourlinks; echo $neighbourlinks;
/// Print the controls across the top /// Print the controls across the top
echo '<div class="discussioncontrols clearfix">'; echo '<div class="discussioncontrols clearfix"><div class="controlscontainer">';
if (!empty($CFG->enableportfolios) && has_capability('mod/forum:exportdiscussion', $modcontext)) { if (!empty($CFG->enableportfolios) && has_capability('mod/forum:exportdiscussion', $modcontext)) {
require_once($CFG->libdir.'/portfoliolib.php'); require_once($CFG->libdir.'/portfoliolib.php');
...@@ -333,8 +356,21 @@ if ($forum->type != 'single' ...@@ -333,8 +356,21 @@ if ($forum->type != 'single'
} }
echo "</div>"; echo "</div>";
} }
echo '<div class="clearfloat">&nbsp;</div>';
echo "</div>"; if (has_capability('mod/forum:pindiscussions', $modcontext)) {
if ($discussion->pinned == FORUM_DISCUSSION_PINNED) {
$pinlink = FORUM_DISCUSSION_UNPINNED;
$pintext = get_string('discussionunpin', 'forum');
} else {
$pinlink = FORUM_DISCUSSION_PINNED;
$pintext = get_string('discussionpin', 'forum');
}
$button = new single_button(new moodle_url('discuss.php', array('pin' => $pinlink, 'd' => $discussion->id)), $pintext, 'post');
echo html_writer::tag('div', $OUTPUT->render($button), array('class' => 'discussioncontrol pindiscussion'));
}
echo "</div></div>";
if (!empty($forum->blockafter) && !empty($forum->blockperiod)) { if (!empty($forum->blockafter) && !empty($forum->blockperiod)) {
$a = new stdClass(); $a = new stdClass();
...@@ -345,7 +381,7 @@ if (!empty($forum->blockafter) && !empty($forum->blockperiod)) { ...@@ -345,7 +381,7 @@ if (!empty($forum->blockafter) && !empty($forum->blockperiod)) {
if ($forum->type == 'qanda' && !has_capability('mod/forum:viewqandawithoutposting', $modcontext) && if ($forum->type == 'qanda' && !has_capability('mod/forum:viewqandawithoutposting', $modcontext) &&
!forum_user_has_posted($forum->id,$discussion->id,$USER->id)) { !forum_user_has_posted($forum->id,$discussion->id,$USER->id)) {
echo $OUTPUT->notification(get_string('qandanotify','forum')); echo $OUTPUT->notification(get_string('qandanotify', 'forum'));
} }
if ($move == -1 and confirm_sesskey()) { if ($move == -1 and confirm_sesskey()) {
......
...@@ -649,7 +649,7 @@ class mod_forum_external extends external_api { ...@@ -649,7 +649,7 @@ class mod_forum_external extends external_api {
// Check they have the view forum capability. // Check they have the view forum capability.
require_capability('mod/forum:viewdiscussion', $modcontext, null, true, 'noviewdiscussionspermission', 'forum'); require_capability('mod/forum:viewdiscussion', $modcontext, null, true, 'noviewdiscussionspermission', 'forum');
$sort = 'd.' . $sortby . ' ' . $sortdirection; $sort = 'd.pinned DESC, d.' . $sortby . ' ' . $sortdirection;
$alldiscussions = forum_get_discussions($cm, $sort, true, -1, -1, true, $page, $perpage, FORUM_POSTS_ALL_USER_GROUPS); $alldiscussions = forum_get_discussions($cm, $sort, true, -1, -1, true, $page, $perpage, FORUM_POSTS_ALL_USER_GROUPS);
if ($alldiscussions) { if ($alldiscussions) {
...@@ -801,7 +801,8 @@ class mod_forum_external extends external_api { ...@@ -801,7 +801,8 @@ class mod_forum_external extends external_api {
'userpictureurl' => new external_value(PARAM_URL, 'Post author picture.'), 'userpictureurl' => new external_value(PARAM_URL, 'Post author picture.'),
'usermodifiedpictureurl' => new external_value(PARAM_URL, 'Post modifier picture.'), 'usermodifiedpictureurl' => new external_value(PARAM_URL, 'Post modifier picture.'),
'numreplies' => new external_value(PARAM_TEXT, 'The number of replies in the discussion'), 'numreplies' => new external_value(PARAM_TEXT, 'The number of replies in the discussion'),
'numunread' => new external_value(PARAM_INT, 'The number of unread discussions.') 'numunread' => new external_value(PARAM_INT, 'The number of unread discussions.'),
'pinned' => new external_value(PARAM_BOOL, 'Is the discussion pinned')
), 'post' ), 'post'
) )
), ),
...@@ -1115,6 +1116,7 @@ class mod_forum_external extends external_api { ...@@ -1115,6 +1116,7 @@ class mod_forum_external extends external_api {
'name' => new external_value(PARAM_ALPHANUM, 'name' => new external_value(PARAM_ALPHANUM,
'The allowed keys (value format) are: 'The allowed keys (value format) are:
discussionsubscribe (bool); subscribe to the discussion?, default to true discussionsubscribe (bool); subscribe to the discussion?, default to true
discussionpinned (bool); is the discussion pinned, default to false
'), '),
'value' => new external_value(PARAM_RAW, 'The value of the option, 'value' => new external_value(PARAM_RAW, 'The value of the option,
This param is validated in the external function.' This param is validated in the external function.'
...@@ -1151,7 +1153,8 @@ class mod_forum_external extends external_api { ...@@ -1151,7 +1153,8 @@ class mod_forum_external extends external_api {
)); ));
// Validate options. // Validate options.
$options = array( $options = array(
'discussionsubscribe' => true 'discussionsubscribe' => true,
'discussionpinned' => false
); );
foreach ($params['options'] as $option) { foreach ($params['options'] as $option) {
$name = trim($option['name']); $name = trim($option['name']);
...@@ -1159,6 +1162,9 @@ class mod_forum_external extends external_api { ...@@ -1159,6 +1162,9 @@ class mod_forum_external extends external_api {
case 'discussionsubscribe': case 'discussionsubscribe':
$value = clean_param($option['value'], PARAM_BOOL); $value = clean_param($option['value'], PARAM_BOOL);
break; break;
case 'discussionpinned':
$value = clean_param($option['value'], PARAM_BOOL);
break;
default: default:
throw new moodle_exception('errorinvalidparam', 'webservice', '', $name); throw new moodle_exception('errorinvalidparam', 'webservice', '', $name);
} }
...@@ -1210,6 +1216,11 @@ class mod_forum_external extends external_api { ...@@ -1210,6 +1216,11 @@ class mod_forum_external extends external_api {
$discussion->name = $discussion->subject; $discussion->name = $discussion->subject;
$discussion->timestart = 0; $discussion->timestart = 0;
$discussion->timeend = 0; $discussion->timeend = 0;
if (has_capability('mod/forum:pindiscussions', $context) && $options['discussionpinned']) {
$discussion->pinned = FORUM_DISCUSSION_PINNED;
} else {
$discussion->pinned = FORUM_DISCUSSION_UNPINNED;
}
if ($discussionid = forum_add_discussion($discussion)) { if ($discussionid = forum_add_discussion($discussion)) {
......
...@@ -138,6 +138,9 @@ $string['discussionmovedpost'] = 'This discussion has been moved to <a href="{$a ...@@ -138,6 +138,9 @@ $string['discussionmovedpost'] = 'This discussion has been moved to <a href="{$a
$string['discussionname'] = 'Discussion name'; $string['discussionname'] = 'Discussion name';
$string['discussionnownotsubscribed'] = '{$a->name} will NOT be notified of new posts in \'{$a->discussion}\' of \'{$a->forum}\''; $string['discussionnownotsubscribed'] = '{$a->name} will NOT be notified of new posts in \'{$a->discussion}\' of \'{$a->forum}\'';
$string['discussionnowsubscribed'] = '{$a->name} will be notified of new posts in \'{$a->discussion}\' of \'{$a->forum}\''; $string['discussionnowsubscribed'] = '{$a->name} will be notified of new posts in \'{$a->discussion}\' of \'{$a->forum}\'';
$string['discussionpin'] = 'Pin';
$string['discussionpinned'] = 'Pinned';
$string['discussionpinned_help'] = 'Pinned discussions will appear at the top of a forum.';
$string['discussionsubscribestop'] = 'I don\'t want to be notified of new posts in this discussion';