forked from getgrav/grav-plugin-maintenance
-
Notifications
You must be signed in to change notification settings - Fork 0
/
maintenance.php
138 lines (112 loc) · 3.67 KB
/
maintenance.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?php
namespace Grav\Plugin;
use Grav\Common\Plugin;
use Grav\Common\Page\Page;
use Grav\Common\Page\Pages;
use Grav\Common\User\User;
use RocketTheme\Toolbox\Event\Event;
class MaintenancePlugin extends Plugin
{
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'onPluginsInitialized' => ['onPluginsInitialized', 0]
];
}
/**
* Initialize configuration
*/
public function onPluginsInitialized()
{
if ($this->isAdmin()) {
$this->active = false;
return;
}
$this->enable([
'onPagesInitialized' => ['onPagesInitialized', 1000000],
'onTwigTemplatePaths' => ['onTwigTemplatePaths', 0],
]);
}
/**
* Initialize a maintenance page
*
* @param Event $event
*/
public function onPagesInitialized(Event $event)
{
$config = $this->config();
if (!$config['active']) {
return;
}
/** @var User $user */
$user = $this->grav['user'];
if ($config['allow_login'] && $user->authenticated && $user->authorize($config['login_access'] ?: 'site.login')) {
// User has been logged in and has permission to access the site when it is in maintenance mode.
return;
}
$pageEvent = new Event();
$pageEvent->config = $config;
$pageEvent->page = null;
// First attempt to get maintenance page by firing getMaintenancePage event.
$this->grav->fireEvent('getMaintenancePage', $pageEvent);
/** @var Page $page */
$page = isset($pageEvent->page) ? $pageEvent->page : null;
if (!$page) {
// Get the custom page route if specified
$custom_page_route = $this->config->get('plugins.maintenance.maintenance_page_route');
if ($custom_page_route) {
/** @var Pages $pages */
$pages = $this->grav['pages'];
// Try to load user error page.
$page = $pages->dispatch($custom_page_route, true);
}
}
// If no page found yet, use the built-in one...
if (!$page) {
$page = new Page;
$page->init(new \SplFileInfo(__DIR__ . "/pages/maintenance.md"));
}
// unset the old page, and use the new one
unset($this->grav['page']);
//Set good header
$page->modifyHeader('http_response_code', $this->config->get('plugins.maintenance.maintenance_status_code'));
$this->grav['page'] = $page;
$this->enable([
'onPageInitialized' => ['onPageInitialized', 1000000],
'onTwigSiteVariables' => ['onTwigSiteVariables', 0]
]);
// Site is on maintenance, prevent other plugins from running.
$event->stopPropagation();
}
/**
* @param Event $event
*/
public function onPageInitialized(Event $event)
{
$this->grav->fireEvent('onMaintenancePage', $event);
// Site is on maintenance, prevent other plugins from running.
$event->stopPropagation();
}
/**
* Add current directory to twig lookup paths.
*/
public function onTwigTemplatePaths()
{
$this->grav['twig']->twig_paths[] = __DIR__ . '/templates';
}
/**
* Set needed variables to display the maintenance page.
*/
public function onTwigSiteVariables()
{
/** @var User $user */
$user = $this->grav['user'];
$config = $this->config();
if ($config['active'] && !$user->authenticated) {
$this->grav['twig']->twig_vars['maintenance'] = $config;
}
}
}