-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathboot.php
More file actions
182 lines (151 loc) · 6.37 KB
/
boot.php
File metadata and controls
182 lines (151 loc) · 6.37 KB
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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
<?php
namespace KLXM\InfoCenter;
use rex;
use rex_extension;
use rex_extension_point;
use rex_view;
use rex_url;
use rex_addon;
use rex_i18n;
use rex_backend_login;
use rex_be_controller;
use rex_perm;
// Frontend-Session starten, damit rex::getUser() funktioniert
if (rex::isFrontend()) {
rex_backend_login::startSession();
}
// Get addon instance
$addon = rex_addon::get('info_center');
// Add i18n translations to JavaScript for Search Widget
if (rex::isBackend()) {
// Berechtigungen registrieren
rex_perm::register('info_center[]');
rex_perm::register('info_center[config]');
rex_perm::register('info_center[recent_articles]');
rex_view::setJsProperty('info_center_search_i18n', [
'categories' => rex_i18n::msg('info_center_search_categories'),
'articles' => rex_i18n::msg('info_center_search_articles'),
'modules' => rex_i18n::msg('info_center_search_modules'),
'templates' => rex_i18n::msg('info_center_search_templates'),
'media' => rex_i18n::msg('info_center_search_media'),
'no_results' => rex_i18n::msg('info_center_search_no_results'),
'loading' => rex_i18n::msg('info_center_search_loading'),
'error' => rex_i18n::msg('info_center_search_error'),
'offline' => rex_i18n::msg('info_center_search_offline'),
'inactive' => rex_i18n::msg('info_center_search_inactive'),
]);
}
// Initialisiere das Info Center
$infoCenter = InfoCenter::getInstance();
// Benutzer-ID für widget-spezifische Einstellungen
$userId = rex::getUser() ? rex::getUser()->getId() : 0;
$userWidgetConfig = $addon->getConfig('widgets_user_' . $userId, []);
// Funktion zur Prüfung ob Widget für den Benutzer aktiviert ist
$isWidgetEnabled = function($widgetId) use ($addon, $userWidgetConfig) {
// Prüfe zuerst globale Einstellungen
$globalConfig = $addon->getConfig('widgets', []);
$globalEnabled = $globalConfig[$widgetId]['enabled'] ?? true;
// Wenn global deaktiviert, ist Widget immer deaktiviert
if (!$globalEnabled) {
return false;
}
// Wenn global aktiviert, prüfe User-spezifische Einstellungen
if (isset($userWidgetConfig[$widgetId]['enabled'])) {
return (bool) $userWidgetConfig[$widgetId]['enabled'];
}
// Fallback: global aktiviert, keine User-Einstellung -> aktiviert
return true;
};
// Registriere Widgets mit korrekten Prioritäten (niedrigste zuerst)
// Search Widget (prio: -10) - Always on top
if ($isWidgetEnabled('search')) {
$widget = new Widgets\SearchWidget();
$widget->setPriority(-10);
$infoCenter->registerWidget($widget);
}
// URL Widget (prio: -1)
if ($isWidgetEnabled('url')) {
$widget = new Widgets\UrlWidget();
$widget->setPriority(-1);
$infoCenter->registerWidget($widget);
}
// TimeTracker Widget (prio: 0)
if ($isWidgetEnabled('timetracker')) {
$widget = new Widgets\TimeTrackerWidget();
$widget->setPriority(0);
$infoCenter->registerWidget($widget);
}
// Article Widget (prio: 1) - Backend und Frontend
if ($isWidgetEnabled('article')) {
$widget = new Widgets\ArticleWidget();
$widget->setPriority(1);
$infoCenter->registerWidget($widget);
}
// Upkeep Widget (prio: 2) - Nur für Admins (nur Backend)
if ($isWidgetEnabled('upkeep') && rex::getUser() && rex::getUser()->isAdmin()) {
$widget = new Widgets\UpkeepWidget();
$widget->setPriority(2);
$infoCenter->registerWidget($widget);
}
// Stats Widget (prio: 5) - Nur für Admins (Backend und Frontend)
$user = rex_backend_login::createUser();
if ($isWidgetEnabled('stats') && $user && $user->isAdmin()) {
$widget = new Widgets\StatsWidget();
$widget->setPriority(5);
$infoCenter->registerWidget($widget);
}
// System Widget (prio: 10) - Nur für Admins (nur Backend)
if ($isWidgetEnabled('system') && rex::getUser() && rex::getUser()->isAdmin()) {
$widget = new Widgets\SystemWidget();
$widget->setPriority(10);
$infoCenter->registerWidget($widget);
}
// Registriere Custom Widgets (prio: 20+)
$infoCenter->registerCustomWidgets();
// Assets einbinden - Backend und Frontend
if (rex::isBackend() && rex::getUser()) {
// Backend: Normale Asset-Einbindung
rex_view::addCssFile($addon->getAssetsUrl('css/info-center.css'));
rex_view::addCssFile($addon->getAssetsUrl('css/timetracker.css'));
rex_view::addJsFile($addon->getAssetsUrl('js/info-center.js'));
rex_view::addJsFile($addon->getAssetsUrl('js/timetracker.js'));
}
// Ausgabe für Backend und Frontend
if (rex::isBackend() && rex::getUser()) {
// Backend: Normale Ausgabe - aber nicht in Popups
rex_extension::register('OUTPUT_FILTER', function(rex_extension_point $ep) use ($infoCenter) {
// Prüfe ob wir uns in einem Popup befinden (z.B. Medienpool)
$currentPage = rex_be_controller::getCurrentPageObject();
if ($currentPage && $currentPage->isPopup()) {
return;
}
$content = $ep->getSubject();
$infoCenterOutput = $infoCenter->get();
// Füge das Info Center vor dem schließenden Body-Tag ein
$content = str_replace('</body>', $infoCenterOutput . '</body>', $content);
$ep->setSubject($content);
});
}
// Frontend Integration - für eingeloggte Backend-Benutzer mit info_center[] Berechtigung
if (rex::isFrontend() && ($user = rex_backend_login::createUser()) && ($user->isAdmin() || $user->hasPerm('info_center[]'))) {
rex_extension::register('OUTPUT_FILTER', function(rex_extension_point $ep) use ($infoCenter, $addon) {
$content = $ep->getSubject();
$infoCenterOutput = $infoCenter->get();
if ($infoCenterOutput) {
// Assets und Info Center vor den schließenden Tags einfügen
$content = str_ireplace(
['</head>', '</body>'],
[
'<link rel="stylesheet" type="text/css" href="' . $addon->getAssetsUrl('css/info-center.css') . '" />
<link rel="stylesheet" type="text/css" href="' . $addon->getAssetsUrl('css/timetracker.css') . '" /></head>',
$infoCenterOutput . '
<script src="' . $addon->getAssetsUrl('js/info-center.js') . '"></script>
<script src="' . $addon->getAssetsUrl('js/timetracker.js') . '"></script>
</body>'
],
$content
);
}
$ep->setSubject($content);
});
}