See Release Notes
Long Term Support Release
Differences Between: [Versions 39 and 311] [Versions 39 and 400] [Versions 39 and 401] [Versions 39 and 402] [Versions 39 and 403]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Discussion exporter class. 19 * 20 * @package mod_forum 21 * @copyright 2019 Ryan Wyllie <ryan@moodle.com> 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 */ 24 25 namespace mod_forum\local\exporters; 26 27 defined('MOODLE_INTERNAL') || die(); 28 29 use mod_forum\local\entities\discussion as discussion_entity; 30 use mod_forum\local\exporters\post as post_exporter; 31 use mod_forum\local\factories\exporter as exporter_factory; 32 use core\external\exporter; 33 use renderer_base; 34 35 /** 36 * Discussion exporter class. 37 * 38 * @copyright 2019 Ryan Wyllie <ryan@moodle.com> 39 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 40 */ 41 class discussion extends exporter { 42 /** @var discussion_entity $discussion Discussion to export */ 43 private $discussion; 44 45 /** 46 * Constructor. 47 * 48 * @param discussion_entity $discussion Discussion to export 49 * @param array $related The related export data 50 */ 51 public function __construct(discussion_entity $discussion, array $related = []) { 52 $this->discussion = $discussion; 53 54 return parent::__construct([], $related); 55 } 56 57 /** 58 * Return the list of additional properties. 59 * 60 * @return array 61 */ 62 protected static function define_other_properties() { 63 return [ 64 'id' => ['type' => PARAM_INT], 65 'forumid' => ['type' => PARAM_INT], 66 'pinned' => ['type' => PARAM_BOOL], 67 'locked' => ['type' => PARAM_BOOL], 68 'istimelocked' => ['type' => PARAM_BOOL], 69 'name' => ['type' => PARAM_TEXT], 70 'firstpostid' => ['type' => PARAM_INT], 71 'group' => [ 72 'optional' => true, 73 'type' => [ 74 'name' => ['type' => PARAM_TEXT], 75 'urls' => [ 76 'type' => [ 77 'picture' => [ 78 'optional' => true, 79 'type' => PARAM_URL, 80 ], 81 'userlist' => [ 82 'optional' => true, 83 'type' => PARAM_URL, 84 ], 85 ], 86 ], 87 ], 88 ], 89 'times' => [ 90 'type' => [ 91 'modified' => ['type' => PARAM_INT], 92 'start' => ['type' => PARAM_INT], 93 'end' => ['type' => PARAM_INT], 94 'locked' => ['type' => PARAM_INT], 95 ], 96 ], 97 'userstate' => [ 98 'type' => [ 99 'subscribed' => ['type' => PARAM_BOOL], 100 'favourited' => ['type' => PARAM_BOOL], 101 ], 102 ], 103 'capabilities' => [ 104 'type' => [ 105 'subscribe' => ['type' => PARAM_BOOL], 106 'move' => ['type' => PARAM_BOOL], 107 'pin' => ['type' => PARAM_BOOL], 108 'post' => ['type' => PARAM_BOOL], 109 'manage' => ['type' => PARAM_BOOL], 110 'favourite' => ['type' => PARAM_BOOL] 111 ] 112 ], 113 'urls' => [ 114 'type' => [ 115 'view' => ['type' => PARAM_URL], 116 'viewlatest' => [ 117 'optional' => true, 118 'type' => PARAM_URL 119 ], 120 'viewfirstunread' => [ 121 'optional' => true, 122 'type' => PARAM_URL, 123 ], 124 'markasread' => ['type' => PARAM_URL], 125 'subscribe' => ['type' => PARAM_URL], 126 'pin' => [ 127 'optional' => true, 128 'type' => PARAM_URL, 129 ], 130 ], 131 ], 132 'timed' => [ 133 'type' => [ 134 'istimed' => [ 135 'type' => PARAM_BOOL, 136 'optional' => true, 137 'default' => null, 138 'null' => NULL_ALLOWED 139 ], 140 'visible' => [ 141 'type' => PARAM_BOOL, 142 'optional' => true, 143 'default' => null, 144 'null' => NULL_ALLOWED 145 ] 146 ] 147 ] 148 ]; 149 } 150 151 /** 152 * Get the additional values to inject while exporting. 153 * 154 * @param renderer_base $output The renderer. 155 * @return array Keys are the property names, values are their values. 156 */ 157 protected function get_other_values(renderer_base $output) { 158 159 $capabilitymanager = $this->related['capabilitymanager']; 160 $urlfactory = $this->related['urlfactory']; 161 $favouriteids = isset($this->related['favouriteids']) ? $this->related['favouriteids'] : []; 162 163 $forum = $this->related['forum']; 164 $forumrecord = $this->get_forum_record(); 165 $user = $this->related['user']; 166 $discussion = $this->discussion; 167 168 $groupdata = null; 169 if ($discussion->has_group()) { 170 $groupsbyid = $this->related['groupsbyid']; 171 $group = $groupsbyid[$discussion->get_group_id()] ?? null; 172 173 // We may not have received the group if the caller doesn't want to include it in the export 174 // or if it's been deleted and the discussion record hasn't been updated. 175 if ($group) { 176 $groupdata = [ 177 'name' => $group->name, 178 'urls' => [], 179 ]; 180 181 // If not hiding the group picture, and the group has a picture then use it. Fallback to generic group image. 182 if (!$group->hidepicture && 183 ($url = get_group_picture_url($group, $forum->get_course_id(), true))) { 184 185 $groupdata['urls']['picture'] = $url; 186 } else { 187 $groupdata['urls']['picture'] = $output->image_url('g/g1')->out(false); 188 } 189 190 if ($capabilitymanager->can_view_participants($user, $discussion)) { 191 $groupdata['urls']['userlist'] = (new \moodle_url('/user/index.php', [ 192 'id' => $forum->get_course_id(), 193 'group' => $group->id, 194 ])); 195 } 196 } 197 } 198 199 $viewfirstunreadurl = $urlfactory->get_discussion_view_first_unread_post_url_from_discussion($discussion); 200 $data = [ 201 'id' => $discussion->get_id(), 202 'forumid' => $forum->get_id(), 203 'pinned' => $discussion->is_pinned(), 204 'locked' => $forum->is_discussion_locked($discussion), 205 'istimelocked' => $forum->is_discussion_time_locked($discussion), 206 'name' => format_string($discussion->get_name(), true, [ 207 'context' => $this->related['context'] 208 ]), 209 'firstpostid' => $discussion->get_first_post_id(), 210 'times' => [ 211 'modified' => $discussion->get_time_modified(), 212 'start' => $discussion->get_time_start(), 213 'end' => $discussion->get_time_end(), 214 'locked' => $discussion->get_locked() 215 ], 216 'userstate' => [ 217 'subscribed' => \mod_forum\subscriptions::is_subscribed($user->id, $forumrecord, $discussion->get_id()), 218 'favourited' => in_array($discussion->get_id(), $favouriteids) ? true : false, 219 ], 220 'capabilities' => [ 221 'subscribe' => $capabilitymanager->can_subscribe_to_discussion($user, $discussion), 222 'move' => $capabilitymanager->can_move_discussion($user, $discussion), 223 'pin' => $capabilitymanager->can_pin_discussion($user, $discussion), 224 'post' => $capabilitymanager->can_post_in_discussion($user, $discussion), 225 'manage' => $capabilitymanager->can_manage_forum($user), 226 'favourite' => $capabilitymanager->can_favourite_discussion($user) // Defaulting to true until we get capabilities sorted 227 ], 228 'urls' => [ 229 'view' => $urlfactory->get_discussion_view_url_from_discussion($discussion)->out(false), 230 'viewfirstunread' => $viewfirstunreadurl->out(false), 231 'markasread' => $urlfactory->get_mark_discussion_as_read_url_from_discussion($forum, $discussion)->out(false), 232 'subscribe' => $urlfactory->get_discussion_subscribe_url($discussion)->out(false) 233 ] 234 ]; 235 236 if (!empty($this->related['latestpostid'])) { 237 $data['urls']['viewlatest'] = $urlfactory->get_discussion_view_latest_post_url_from_discussion( 238 $discussion, 239 $this->related['latestpostid'] 240 )->out(false); 241 } 242 243 if ($capabilitymanager->can_pin_discussions($user)) { 244 $data['urls']['pin'] = $urlfactory->get_pin_discussion_url_from_discussion($discussion)->out(false); 245 } 246 247 if ($groupdata) { 248 $data['group'] = $groupdata; 249 } 250 251 $canviewhiddentimedposts = $capabilitymanager->can_view_hidden_posts($user); 252 $canalwaysseetimedpost = $user->id == $discussion->get_user_id() || $canviewhiddentimedposts; 253 $data['timed']['istimed'] = $canalwaysseetimedpost ? $discussion->is_timed_discussion() : null; 254 $data['timed']['visible'] = $canalwaysseetimedpost ? $discussion->is_timed_discussion_visible() : null; 255 256 return $data; 257 } 258 259 /** 260 * Get the legacy forum record from the forum entity. 261 * 262 * @return stdClass 263 */ 264 private function get_forum_record() { 265 $forumdbdatamapper = $this->related['legacydatamapperfactory']->get_forum_data_mapper(); 266 return $forumdbdatamapper->to_legacy_object($this->related['forum']); 267 } 268 269 /** 270 * Returns a list of objects that are related. 271 * 272 * @return array 273 */ 274 protected static function define_related() { 275 return [ 276 'legacydatamapperfactory' => 'mod_forum\local\factories\legacy_data_mapper', 277 'context' => 'context', 278 'forum' => 'mod_forum\local\entities\forum', 279 'capabilitymanager' => 'mod_forum\local\managers\capability', 280 'urlfactory' => 'mod_forum\local\factories\url', 281 'user' => 'stdClass', 282 'groupsbyid' => 'stdClass[]', 283 'latestpostid' => 'int?', 284 'favouriteids' => 'int[]?' 285 ]; 286 } 287 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body