CustomErrorController.php in Customerror 8
File
src/Controller/CustomErrorController.php
View source
<?php
namespace Drupal\customerror\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Url;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpFoundation\RedirectResponse;
class CustomErrorController extends ControllerBase {
public function index($code) {
if (!is_numeric($code)) {
throw new AccessDeniedHttpException();
}
$theme = customerror_get_theme($code);
if (!empty($theme)) {
global $custom_theme;
$custom_theme = $theme;
}
switch ($code) {
case 403:
$internal_path = substr(\Drupal::request()
->getRequestUri(), strlen(base_path()));
if ($internal_path) {
$dest = parse_url($internal_path);
if (isset($dest['query']['destination'])) {
$_GET['destination'] = $dest['query']['destination'];
}
else {
$_GET['destination'] = $internal_path;
}
}
else {
$_GET['destination'] = \Drupal::config('system.site')
->get('page.front');
}
$_SESSION['destination'] = $_GET['destination'];
case 404:
default:
$destination = \Drupal::request()
->getRequestUri();
$redirect_list = \Drupal::config('customerror.settings')
->get('redirect');
$redirect_list = !empty($redirect_list) ? explode("\n", $redirect_list) : [];
foreach ($redirect_list as $item) {
list($src, $dst) = explode(' ', $item);
if (isset($src) && isset($dst)) {
$src = str_replace("/", "\\/", $src);
$dst = str_replace("\r", "", $dst);
$orig_dst = str_replace(" ", "%20", $destination);
if (preg_match("/{$src}/", $orig_dst)) {
$dst = $dst == '<front>' ? Url::fromRoute($dst)
->toString() : $dst;
header('Location: ' . $dst, TRUE, 302);
exit;
}
}
}
customerror_header($code);
$content = \Drupal::config('customerror.settings')
->get("{$code}.body");
break;
}
$login_form = '';
if (\Drupal::currentUser()
->isAnonymous()) {
$form_state = new \Drupal\Core\Form\FormState();
$login_form = \Drupal::formBuilder()
->getForm('Drupal\\user\\Form\\UserLoginForm', $form_state);
}
return [
'#theme' => 'customerror__' . $code,
'#description' => $content,
'#login_form' => $login_form,
];
}
public function titleCallback($code) {
return \Drupal::config('customerror.settings')
->get("{$code}.title");
}
protected function getRequest() {
if (!$this->requestStack) {
$this->requestStack = \Drupal::service('request_stack');
}
return $this->requestStack
->getCurrentRequest();
}
}