-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathinstall.php
More file actions
188 lines (170 loc) · 7.79 KB
/
install.php
File metadata and controls
188 lines (170 loc) · 7.79 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
183
184
185
186
187
188
<?php
/**
* @var rex_addon $this
* @psalm-scope-this rex_addon
*/
$profileTable = rex::getTable('tinymce_profiles');
$isReinstall = false;
// Reinstall path: if profile table is already accessible, treat install as update.
try {
$probeSql = rex_sql::factory();
$probeSql->setQuery('SELECT id FROM ' . $profileTable . ' LIMIT 1');
$isReinstall = true;
} catch (rex_sql_exception $e) {
$isReinstall = false;
}
// ensure schema (include a plain PHP file — safe during install/update)
$this->includeFile(__DIR__ . '/ensure_table.php');
if ($isReinstall) {
$this->includeFile(__DIR__ . '/update.php');
return;
}
// Set flag to regenerate profiles.js on first backend request
// This ensures external plugins get correct absolute URLs (boot.php runs at runtime)
$this->setConfig('update_profiles', true);
// =============================================================================
// Alle Standardprofile aus JSON importieren.
// Demo-Profil ist in der JSON enthalten und wird hier ebenfalls angelegt.
// Bei Reinstall delegiert install.php an update.php – dort wird nur das
// Demo-Profil force-aktualisiert.
//
// Klassen manuell laden: Bei einer frischen Installation ist der Composer-
// Classmap-Cache noch nicht (neu) aufgebaut, daher greift der Autoloader für
// AddOn-Klassen hier noch nicht. Wir ziehen alle PHP-Klassendateien unter
// lib/TinyMce/ rekursiv nach.
//
// Beim Update läuft der Code im .new.tinymce-Pfad, während der Autoloader
// die gleichnamigen Klassen bereits aus dem alten tinymce-Pfad geladen hat.
// Darum vor jedem require_once prüfen, ob die Klasse / das Interface schon
// existiert – sonst gibt es „Cannot declare class … already in use".
$__tinymceClassIter = new \RecursiveIteratorIterator(
new \RecursiveDirectoryIterator(__DIR__ . '/lib/TinyMce', \FilesystemIterator::SKIP_DOTS)
);
foreach ($__tinymceClassIter as $__tinymceClassFile) {
if (!$__tinymceClassFile->isFile() || !str_ends_with($__tinymceClassFile->getFilename(), '.php')) {
continue;
}
$__tinymceClassSource = (string) file_get_contents($__tinymceClassFile->getPathname());
if (preg_match('/namespace\s+([^;\s]+)\s*;/', $__tinymceClassSource, $__ns)
&& preg_match('/\b(?:class|interface|trait|enum)\s+([A-Za-z_][A-Za-z0-9_]*)/', $__tinymceClassSource, $__cls)
) {
$__fqn = $__ns[1] . '\\' . $__cls[1];
if (class_exists($__fqn, false) || interface_exists($__fqn, false) || trait_exists($__fqn, false) || (function_exists('enum_exists') && enum_exists($__fqn, false))) {
continue;
}
}
require_once $__tinymceClassFile->getPathname();
}
unset($__tinymceClassIter, $__tinymceClassFile, $__tinymceClassSource, $__ns, $__cls, $__fqn);
// Alle Standardprofile (full, light, default, demo) aus JSON einspielen.
// forceUpdate=false: bereits vorhandene Profile werden nicht überschrieben.
try {
\FriendsOfRedaxo\TinyMce\Utils\ProfileHelper::importProfileFromJson(
__DIR__ . '/install/tinymce-profiles.json'
);
} catch (\Throwable $e) {
\rex_logger::logException($e);
echo \rex_view::error($e->getMessage());
}
// Style-Sets: Table is created via ensure_table.php
// Default sets are NOT auto-installed - user can install them via "Demo-Sets installieren" button
// =============================================================================
// Demo-Snippets: nur bei frischer Installation einfügen (0 Einträge in Tabelle)
// =============================================================================
try {
$snippetSql = \rex_sql::factory();
$snippetCount = (int) $snippetSql->getValue('SELECT COUNT(*) FROM ' . \rex::getTable('tinymce_snippets'));
if ($snippetCount === 0) {
$now = date('Y-m-d H:i:s');
$demoSnippets = [
[
'name' => 'Kontaktinformationen',
'content' => <<<'HTML'
<div class="contact-info">
<h3>So erreichen Sie uns</h3>
<address>
<p><strong>Musterunternehmen GmbH</strong><br>
Musterstraße 42<br>
12345 Musterstadt</p>
<p>📞 <a href="tel:+491234567890">+49 123 456 78-90</a><br>
📠 +49 123 456 78-99<br>
✉ <a href="mailto:hallo@musterunternehmen.de">hallo@musterunternehmen.de</a></p>
<p>🌐 <a href="https://www.musterunternehmen.de">www.musterunternehmen.de</a></p>
</address>
</div>
HTML,
],
[
'name' => 'Öffnungszeiten',
'content' => <<<'HTML'
<div class="opening-hours">
<h3>Unsere Öffnungszeiten</h3>
<table>
<tbody>
<tr><td><strong>Montag – Donnerstag</strong></td><td>08:00 – 17:30 Uhr</td></tr>
<tr><td><strong>Freitag</strong></td><td>08:00 – 14:00 Uhr</td></tr>
<tr><td><strong>Samstag</strong></td><td>09:00 – 13:00 Uhr</td></tr>
<tr><td><strong>Sonntag & Feiertage</strong></td><td>Geschlossen</td></tr>
</tbody>
</table>
<p><em>Termine außerhalb der regulären Zeiten gerne nach Vereinbarung.</em></p>
</div>
HTML,
],
[
'name' => 'Stellenausschreibung (witzig)',
'content' => <<<'HTML'
<div class="job-posting">
<h2>Gesucht: PHP-Flüsterer (m/w/d) – auch bekannt als Softwareentwickler</h2>
<p><strong>Vollzeit · Remote möglich · Kaffeeflat inklusive</strong></p>
<h3>Über uns</h3>
<p>Wir sind ein dynamisches Unternehmen, das so agil ist, dass selbst unsere Kaffeemaschine Sprints macht. Unsere Meetings dauern selten länger als ein Standup – außer dem Freitagsmeeting, das irgendwie immer beim Biergarten endet.</p>
<h3>Ihre Aufgaben</h3>
<ul>
<li>Code schreiben, der so sauber ist, dass Ihre Kolleginnen und Kollegen spontan weinen (vor Freude, natürlich)</li>
<li>Bugs debuggen, die sich seit 2019 erfolgreich verstecken</li>
<li>Technische Schulden in produktive Features umdeuten</li>
<li>Gelegentlich an Meetings teilnehmen und dabei so tun, als hätte man die E-Mail gelesen</li>
<li>Die Frage „Könnte man das nicht einfach mit KI machen?" souverän beantworten</li>
</ul>
<h3>Das bringen Sie mit</h3>
<ul>
<li>Mehrjährige Erfahrung mit PHP – oder zumindest eine überzeugende Geschichte darüber</li>
<li>Kenntnisse in REDAXO, weil Sie sonst nicht hier wären</li>
<li>Humor, Geduld und die Fähigkeit, bei „Es war doch gestern noch alles okay!" ruhig zu bleiben</li>
<li>Teamgeist – wir arbeiten zusammen, auch wenn Git Merge-Konflikte das nicht immer so sehen</li>
</ul>
<h3>Das bieten wir</h3>
<ul>
<li>☕ Kaffee in allen erdenklichen Formen und Temperaturen</li>
<li>🏠 Homeoffice – Ihre Katze darf am Meeting teilnehmen</li>
<li>🎯 Flache Hierarchien (unser CTO macht selbst noch Pull Requests)</li>
<li>🚀 Moderne Technologien (meistens)</li>
<li>🎉 Legendäre Weihnachtsfeier, bei der sich alle fest vornehmen, früher zu gehen</li>
</ul>
<p><strong>Klingt gut?</strong> Dann schicken Sie uns Ihre Bewerbung – gerne mit Lebenslauf, Arbeitsproben und dem Lieblingsfehlercode, den Sie je debuggt haben.</p>
<p>📧 <a href="mailto:jobs@musterunternehmen.de">jobs@musterunternehmen.de</a></p>
</div>
HTML,
],
];
foreach ($demoSnippets as $snippet) {
$ins = \rex_sql::factory();
$ins->setTable(\rex::getTable('tinymce_snippets'));
$ins->setValue('name', $snippet['name']);
$ins->setValue('content', $snippet['content']);
$ins->setValue('active', 1);
$ins->setValue('createdate', $now);
$ins->setValue('updatedate', $now);
$ins->setValue('createuser', 'admin');
$ins->setValue('updateuser', 'admin');
try {
$ins->insert();
} catch (\Throwable $e) {
\rex_logger::logException($e);
}
}
}
} catch (\Throwable $e) {
\rex_logger::logException($e);
}