AutorÃa | Ultima modificación | Ver Log |
<?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/>.
namespace core\route\controller;
use core\form\error_feedback;
use core\router;
use core\router\route;
use core\router\schema\parameters\query_parameter;
use core\router\util;
use core\url;
use core_user;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
/**
* Page Not Found Controller.
*
* @package core
* @copyright Andrew Lyons <andrew@nicols.co.uk>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class page_not_found_controller {
use \core\router\route_controller;
/**
* Constructor for the page not found handler.
*
* @param \core\router $router The router.
*/
public function __construct(
/** @var router The routing engine */
private router $router,
) {
}
/**
* Administer a course.
*
* @param ServerRequestInterface $request
* @param ResponseInterface $response
* @return ResponseInterface
*/
#[route(
path: '/error',
method: ['GET', 'POST'],
queryparams: [
new query_parameter(
name: 'code',
type: \core\param::INT,
default: 404,
),
],
)]
public function page_not_found_handler(
ServerRequestInterface $request,
): ResponseInterface {
global $CFG, $PAGE, $OUTPUT, $ME;
$context = \core\context\system::instance();
$title = get_string('pagenotexisttitle', 'error');
$PAGE->set_url('/error');
$PAGE->set_context($context);
$PAGE->set_title($title);
$PAGE->set_heading($title);
$PAGE->navbar->add($title);
// This allows the webserver to dictate wether the http status should remain
// what it would have been, or force it to be a 404. Under other conditions
// it could most often be a 403, 405 or a 50x error.
$code = $request->getQueryParams()['code'] ?? 404;
$response = $this->router->get_app()->getResponseFactory()->createResponse($code);
$mform = $this->get_message_form($response);
if ($mform) {
if ($this->process_message_form($mform)) {
// The form was submitted. Redirect to the home page.
return util::redirect(
$response,
new url('/'),
);
}
// Form not submitted. We need to set the referer and request path because the URI may be different on submission.
$mform->set_data([
'referer' => $request->getHeaderLine('Referer'),
'requested' => $request->getUri()->getPath(),
]);
}
$response->getBody()->write($OUTPUT->header());
$response->getBody()->write($OUTPUT->notification(get_string('pagenotexist', 'error', s($ME)), 'error'));
$response->getBody()->write($OUTPUT->supportemail(['class' => 'text-center d-block mb-3 fw-bold']));
if ($mform) {
$response->getBody()->write(\html_writer::tag('h4', get_string('sendmessage', 'error')));
$response->getBody()->write($mform->render());
} else {
$response->getBody()->write($OUTPUT->continue_button($CFG->wwwroot));
}
$response->getBody()->write($OUTPUT->footer());
return $response;
}
/**
* Get the message form, or null if it should not be displayed.
*
* @param \Psr\Http\Message\ResponseInterface $response
* @return error_feedback|null
*/
protected function get_message_form(
ResponseInterface $response,
): ?\moodleform {
$canmessage = has_capability('moodle/site:senderrormessage', \core\context\system::instance());
$supportuser = core_user::get_support_user();
// We can only message support if both the user has the capability
// and the support user is a real user.
$canmessage = $canmessage && core_user::is_real_user($supportuser->id);
if (!$canmessage) {
return null;
}
return new error_feedback(util::get_path_for_callable([self::class, 'page_not_found_handler'], [], [])->out());
}
/**
* Process the message form.
*
* If the form was submitted, send the message and return a redirect response.
*
* @param error_feedback $mform
* @return bool
*/
protected function process_message_form(
error_feedback $mform,
): bool {
global $CFG, $USER;
if ($data = $mform->get_data()) {
// Send the message and redirect.
$message = new \core\message\message();
$message->courseid = SITEID;
$message->component = 'moodle';
$message->name = 'errors';
$message->userfrom = $USER;
$message->userto = core_user::get_support_user();
$message->subject = 'Error: ' . $data->referer . ' -> ' . $data->requested;
$message->fullmessage = $data->text;
$message->fullmessageformat = FORMAT_PLAIN;
$message->fullmessagehtml = '';
$message->smallmessage = '';
$message->contexturl = $data->requested;
message_send($message);
\core\notification::success(get_string('sendmessagesent', 'error', $data->requested));
return true;
}
return false;
}
}