You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
494 lines
16 KiB
494 lines
16 KiB
2 years ago
|
<?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/>.
|
||
|
|
||
|
/**
|
||
|
* A URL factory for the forum.
|
||
|
*
|
||
|
* @package mod_forum
|
||
|
* @copyright 2019 Andrew Nicols <andrew@nicols.co.uk>
|
||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||
|
*/
|
||
|
|
||
|
namespace mod_forum\local\factories;
|
||
|
|
||
|
defined('MOODLE_INTERNAL') || die();
|
||
|
|
||
|
use mod_forum\local\entities\author as author_entity;
|
||
|
use mod_forum\local\entities\forum as forum_entity;
|
||
|
use mod_forum\local\entities\discussion as discussion_entity;
|
||
|
use mod_forum\local\entities\post as post_entity;
|
||
|
use mod_forum\local\factories\legacy_data_mapper as legacy_data_mapper_factory;
|
||
|
use moodle_url;
|
||
|
use stored_file;
|
||
|
use user_picture;
|
||
|
|
||
|
require_once($CFG->dirroot . '/mod/forum/lib.php');
|
||
|
|
||
|
/**
|
||
|
* A URL factory for the forum.
|
||
|
*
|
||
|
* @copyright 2019 Andrew Nicols <andrew@nicols.co.uk>
|
||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||
|
*/
|
||
|
class url {
|
||
|
/** @var legacy_data_mapper_factory $legacydatamapperfactory Legacy data mapper factory */
|
||
|
private $legacydatamapperfactory;
|
||
|
|
||
|
/**
|
||
|
* Constructor.
|
||
|
*
|
||
|
* @param legacy_data_mapper_factory $legacydatamapperfactory Legacy data mapper factory
|
||
|
*/
|
||
|
public function __construct(legacy_data_mapper_factory $legacydatamapperfactory) {
|
||
|
$this->legacydatamapperfactory = $legacydatamapperfactory;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the course url from the given course id.
|
||
|
*
|
||
|
* @param int $courseid The course id
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_course_url_from_courseid(int $courseid) : moodle_url {
|
||
|
return new moodle_url('/course/view.php', [
|
||
|
'id' => $courseid,
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the course url from the given forum entity.
|
||
|
*
|
||
|
* @param forum_entity $forum The forum entity
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_course_url_from_forum(forum_entity $forum) : moodle_url {
|
||
|
return $this->get_course_url_from_courseid($forum->get_course_id());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the create discussion url for the given forum.
|
||
|
*
|
||
|
* @param forum_entity $forum The forum entity
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_discussion_create_url(forum_entity $forum) : moodle_url {
|
||
|
return new moodle_url('/mod/forum/post.php', [
|
||
|
'forum' => $forum->get_id(),
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the view forum url for the given forum and optionally a page number.
|
||
|
*
|
||
|
* @param forum_entity $forum The forum entity
|
||
|
* @param int|null $pageno The page number
|
||
|
* @param int|null $sortorder The sorting order
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_forum_view_url_from_forum(forum_entity $forum, ?int $pageno = null,
|
||
|
?int $sortorder = null) : moodle_url {
|
||
|
|
||
|
return $this->get_forum_view_url_from_course_module_id($forum->get_course_module_record()->id, $pageno, $sortorder);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the view forum url for the given course module id and optionally a page number.
|
||
|
*
|
||
|
* @param int $coursemoduleid The course module id
|
||
|
* @param int|null $pageno The page number
|
||
|
* @param int|null $sortorder The sorting order
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_forum_view_url_from_course_module_id(int $coursemoduleid, ?int $pageno = null,
|
||
|
?int $sortorder = null) : moodle_url {
|
||
|
|
||
|
$url = new moodle_url('/mod/forum/view.php', [
|
||
|
'id' => $coursemoduleid,
|
||
|
]);
|
||
|
|
||
|
if (null !== $pageno) {
|
||
|
$url->param('p', $pageno);
|
||
|
}
|
||
|
|
||
|
if (null !== $sortorder) {
|
||
|
$url->param('o', $sortorder);
|
||
|
}
|
||
|
|
||
|
return $url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the view discussion url from the given discussion id.
|
||
|
*
|
||
|
* @param int $discussionid The discussion id
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_discussion_view_url_from_discussion_id(int $discussionid) : moodle_url {
|
||
|
return new moodle_url('/mod/forum/discuss.php', [
|
||
|
'd' => $discussionid
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the view discussion url from the given discussion.
|
||
|
*
|
||
|
* @param discussion_entity $discussion The discussion
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_discussion_view_url_from_discussion(discussion_entity $discussion) : moodle_url {
|
||
|
return $this->get_discussion_view_url_from_discussion_id($discussion->get_id());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view the first unread post in a discussion.
|
||
|
*
|
||
|
* @param discussion_entity $discussion The discussion
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_discussion_view_first_unread_post_url_from_discussion(discussion_entity $discussion) {
|
||
|
$viewurl = $this->get_discussion_view_url_from_discussion_id($discussion->get_id());
|
||
|
$viewurl->set_anchor('unread');
|
||
|
|
||
|
return $viewurl;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view the latest post in a discussion.
|
||
|
*
|
||
|
* @param discussion_entity $discussion The discussion
|
||
|
* @param int|null $latestpost The id of the latest post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_discussion_view_latest_post_url_from_discussion(discussion_entity $discussion, ?int $latestpost) {
|
||
|
$viewurl = $this->get_discussion_view_url_from_discussion_id($discussion->get_id());
|
||
|
if (null === $latestpost) {
|
||
|
return $viewurl;
|
||
|
} else {
|
||
|
return new moodle_url($viewurl, ['parent' => $latestpost]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view a discussion from a post.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_discussion_view_url_from_post(post_entity $post) : moodle_url {
|
||
|
return $this->get_discussion_view_url_from_discussion_id($post->get_discussion_id());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view a discussion from a discussion id and post id.
|
||
|
*
|
||
|
* @param int $discussionid The discussion id
|
||
|
* @param int $postid The post id
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_view_post_url_from_post_id(int $discussionid, int $postid) : moodle_url {
|
||
|
$url = $this->get_discussion_view_url_from_discussion_id($discussionid);
|
||
|
$url->set_anchor('p' . $postid);
|
||
|
return $url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view a post in the context of the rest of the discussion.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_view_post_url_from_post(post_entity $post) : moodle_url {
|
||
|
return $this->get_view_post_url_from_post_id($post->get_discussion_id(), $post->get_id());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view a post and it's replies in isolation without the rest of the
|
||
|
* discussion.
|
||
|
*
|
||
|
* @param int $discussionid The discussion id
|
||
|
* @param int $postid The post id
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_view_isolated_post_url_from_post_id(int $discussionid, int $postid) : moodle_url {
|
||
|
$url = $this->get_discussion_view_url_from_discussion_id($discussionid);
|
||
|
$url->params(['parent' => $postid]);
|
||
|
return $url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view a post and it's replies in isolation without the rest of the
|
||
|
* discussion.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_view_isolated_post_url_from_post(post_entity $post) : moodle_url {
|
||
|
return $this->get_view_isolated_post_url_from_post_id($post->get_discussion_id(), $post->get_id());
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to edit a post.
|
||
|
*
|
||
|
* @param forum_entity $forum The forum the post belongs to
|
||
|
* @param post_entity $post The post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_edit_post_url_from_post(forum_entity $forum, post_entity $post) : moodle_url {
|
||
|
if ($forum->get_type() == 'single' && !$post->has_parent()) {
|
||
|
return new moodle_url('/course/modedit.php', [
|
||
|
'update' => $forum->get_course_module_record()->id,
|
||
|
'sesskey' => sesskey(),
|
||
|
'return' => 1
|
||
|
]);
|
||
|
} else {
|
||
|
return new moodle_url('/mod/forum/post.php', [
|
||
|
'edit' => $post->get_id()
|
||
|
]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to split a discussion at a post.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_split_discussion_at_post_url_from_post(post_entity $post) : moodle_url {
|
||
|
return new moodle_url('/mod/forum/post.php', [
|
||
|
'prune' => $post->get_id()
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to delete a post.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_delete_post_url_from_post(post_entity $post) : moodle_url {
|
||
|
return new moodle_url('/mod/forum/post.php', [
|
||
|
'delete' => $post->get_id()
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to reply to a post.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_reply_to_post_url_from_post(post_entity $post) : moodle_url {
|
||
|
return new moodle_url('/mod/forum/post.php#mformforum', [
|
||
|
'reply' => $post->get_id()
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to export (see portfolios) a post.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_export_post_url_from_post(post_entity $post) : ?moodle_url {
|
||
|
global $CFG;
|
||
|
|
||
|
require_once($CFG->libdir . '/portfoliolib.php');
|
||
|
$button = new \portfolio_add_button();
|
||
|
$button->set_callback_options('forum_portfolio_caller', ['postid' => $post->get_id()], 'mod_forum');
|
||
|
if ($post->has_attachments()) {
|
||
|
$button->set_formats(PORTFOLIO_FORMAT_RICHHTML);
|
||
|
} else {
|
||
|
$button->set_formats(PORTFOLIO_FORMAT_PLAINHTML);
|
||
|
}
|
||
|
|
||
|
$url = $button->to_html(PORTFOLIO_ADD_MOODLE_URL);
|
||
|
return $url ?: null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to mark a post as read.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @param int $displaymode The display mode to show the forum in after marking as read
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_mark_post_as_read_url_from_post(post_entity $post, int $displaymode = FORUM_MODE_THREADED) : moodle_url {
|
||
|
$params = [
|
||
|
'd' => $post->get_discussion_id(),
|
||
|
'postid' => $post->get_id(),
|
||
|
'mark' => 'read'
|
||
|
];
|
||
|
|
||
|
$url = new moodle_url('/mod/forum/discuss.php', $params);
|
||
|
|
||
|
if ($displaymode == FORUM_MODE_THREADED) {
|
||
|
$url->param('parent', $post->get_parent_id());
|
||
|
} else {
|
||
|
$url->set_anchor('p' . $post->get_id());
|
||
|
}
|
||
|
|
||
|
return $url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to mark a post as unread.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @param int $displaymode The display mode to show the forum in after marking as unread
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_mark_post_as_unread_url_from_post(post_entity $post, int $displaymode = FORUM_MODE_THREADED) : moodle_url {
|
||
|
$params = [
|
||
|
'd' => $post->get_discussion_id(),
|
||
|
'postid' => $post->get_id(),
|
||
|
'mark' => 'unread'
|
||
|
];
|
||
|
|
||
|
$url = new moodle_url('/mod/forum/discuss.php', $params);
|
||
|
|
||
|
if ($displaymode == FORUM_MODE_THREADED) {
|
||
|
$url->param('parent', $post->get_parent_id());
|
||
|
} else {
|
||
|
$url->set_anchor('p' . $post->get_id());
|
||
|
}
|
||
|
|
||
|
return $url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to export attachments for a post.
|
||
|
*
|
||
|
* @param post_entity $post The post
|
||
|
* @param stored_file $attachment
|
||
|
* @return moodle_url|null
|
||
|
*/
|
||
|
public function get_export_attachment_url_from_post_and_attachment(post_entity $post, stored_file $attachment) : ?moodle_url {
|
||
|
global $CFG;
|
||
|
|
||
|
require_once($CFG->libdir . '/portfoliolib.php');
|
||
|
$button = new \portfolio_add_button();
|
||
|
$button->set_callback_options(
|
||
|
'forum_portfolio_caller',
|
||
|
['postid' => $post->get_id(), 'attachment' => $attachment->get_id()],
|
||
|
'mod_forum'
|
||
|
);
|
||
|
$button->set_format_by_file($attachment);
|
||
|
$url = $button->to_html(PORTFOLIO_ADD_MOODLE_URL);
|
||
|
return $url ?: null;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view an author's profile.
|
||
|
*
|
||
|
* @param author_entity $author The author
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_author_profile_url(author_entity $author) : moodle_url {
|
||
|
return new moodle_url('/user/view.php', [
|
||
|
'id' => $author->get_id()
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to view the author's profile image. The author's context id should be
|
||
|
* provided to prevent the code from needing to load it.
|
||
|
*
|
||
|
* @param author_entity $author The author
|
||
|
* @param int|null $authorcontextid The author context id
|
||
|
* @param int $size The size of the image to return
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_author_profile_image_url(
|
||
|
author_entity $author,
|
||
|
int $authorcontextid = null,
|
||
|
int $size = 100
|
||
|
) : moodle_url {
|
||
|
global $PAGE;
|
||
|
|
||
|
$datamapper = $this->legacydatamapperfactory->get_author_data_mapper();
|
||
|
$record = $datamapper->to_legacy_object($author);
|
||
|
$record->contextid = $authorcontextid;
|
||
|
$userpicture = new user_picture($record);
|
||
|
$userpicture->size = $size;
|
||
|
|
||
|
return $userpicture->get_url($PAGE);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to mark a discussion as read.
|
||
|
*
|
||
|
* @param forum_entity $forum The forum that the discussion belongs to
|
||
|
* @param discussion_entity $discussion The discussion
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_mark_discussion_as_read_url_from_discussion(
|
||
|
forum_entity $forum,
|
||
|
discussion_entity $discussion
|
||
|
) : moodle_url {
|
||
|
return new moodle_url('/mod/forum/markposts.php', [
|
||
|
'f' => $discussion->get_forum_id(),
|
||
|
'd' => $discussion->get_id(),
|
||
|
'mark' => 'read',
|
||
|
'sesskey' => sesskey(),
|
||
|
'return' => $this->get_forum_view_url_from_forum($forum)->out(),
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to mark all discussions as read.
|
||
|
*
|
||
|
* @param forum_entity $forum The forum that the discussions belong to
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_mark_all_discussions_as_read_url(forum_entity $forum) : moodle_url {
|
||
|
return new moodle_url('/mod/forum/markposts.php', [
|
||
|
'f' => $forum->get_id(),
|
||
|
'mark' => 'read',
|
||
|
'sesskey' => sesskey(),
|
||
|
'return' => $this->get_forum_view_url_from_forum($forum)->out(),
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get the url to subscribe to a discussion.
|
||
|
*
|
||
|
* @param discussion_entity $discussion The discussion
|
||
|
* @return moodle_url
|
||
|
*/
|
||
|
public function get_discussion_subscribe_url(discussion_entity $discussion) : moodle_url {
|
||
|
return new moodle_url('/mod/forum/subscribe.php', [
|
||
|
'sesskey' => sesskey(),
|
||
|
'id' => $discussion->get_forum_id(),
|
||
|
'd' => $discussion->get_id()
|
||
|
]);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Generate the pinned discussion link
|
||
|
*
|
||
|
* @param discussion_entity $discussion
|
||
|
* @return moodle_url
|
||
|
* @throws \moodle_exception
|
||
|
*/
|
||
|
public function get_pin_discussion_url_from_discussion(discussion_entity $discussion) : moodle_url {
|
||
|
return new moodle_url('discuss.php', [
|
||
|
'sesskey' => sesskey(),
|
||
|
'd' => $discussion->get_id(),
|
||
|
'pin' => $discussion->is_pinned() ? FORUM_DISCUSSION_UNPINNED : FORUM_DISCUSSION_PINNED
|
||
|
]);
|
||
|
}
|
||
|
}
|