33 throw new RuntimeException($message);
52 isset(
$byId[$requiredId])
53 &&
$byId[$requiredId][
'required'] ===
true
54 &&
$byId[$requiredId][
'status'] ===
'ok',
55 'Notwendige Systemprüfung fehlt oder schlägt fehl: ' . $requiredId
59 'optional-pdo_sqlite',
62 'optional-pdo_sqlsrv',
67 isset(
$byId[$optionalId]),
68 'Optionale Systemprüfung fehlt: ' . $optionalId
73 $root .
'/dbx/design/dbxapp/htm/install.htm'
76 $root .
'/dbx/design/dbxapp/css/install.css'
79 $root .
'/dbx/design/dbxapp/js/install.js'
82 $root .
'/dbx/js/lib/utilities.js'
85 $root .
'/dbx/js/lib/openWin.js'
88 dirname(__DIR__) .
'/include/dbxInstall.class.php'
91 $root .
'/dbx/include/dbxWebApp.class.php'
93$api = (string)file_get_contents(
94 $root .
'/dbx/include/dbxApi.php'
96$mail = (string)file_get_contents(
97 $root .
'/dbx/include/dbxMail.class.php'
102 && str_contains(
$template,
'install.css')
103 && str_contains(
$template,
'dbx/design/dbxapp/css/colors.css')
105 && str_contains(
$template,
'install.css?v=5')
106 && str_contains(
$template,
'install.js?v=3')
108 'Eigenständiges Installationsdesign ist unvollständig.'
111 str_contains(
$style,
'.dbx-install-layout')
112 && str_contains(
$style,
'@media (max-width: 780px)')
113 && str_contains(
$style,
'dbx-content-blue-v1.svg?v=2')
114 && str_contains(
$style,
'background-attachment: fixed')
115 && str_contains(
$style,
'.dbx-install-password-toggle')
116 && str_contains(
$javascript,
'data-dbx-password-toggle')
117 && str_contains(
$javascript,
'data-install-storage-note')
119 && str_contains(
$javascript,
'Passwort verbergen'),
120 'Installationsdesign ist nicht responsiv oder nicht im dbxapp-Blue-Stil definiert.'
123 str_contains(
$openWin,
'getViewportPageBounds()')
124 && str_contains(
$openWin,
'window.visualViewport')
125 && str_contains(
$openWin,
'bounds.top + (viewportHeight - height) / 2')
126 && str_contains(
$openWin,
'Math.max(bounds.top, bounds.bottom - height)')
127 && str_contains(
$openWin,
'this.clampWindowToViewport(windowData)'),
128 'openWin muss Installationshilfen vollständig innerhalb des sichtbaren Viewports öffnen.'
131 str_contains(
$workflow,
'data-install-storage-note="sqlite"')
132 && str_contains(
$workflow,
'data-install-storage-note="mysql"')
133 && str_contains(
$workflow,
'data-install-storage-note="configured"')
134 && str_contains(
$workflow,
"value=\"' . \$this->h(\$checkAction) . '\"")
135 && str_contains(
$workflow,
"'check_database'")
136 && str_contains(
$workflow,
"'check_mail'")
137 && str_contains(
$workflow,
'Datenbank erneut prüfen')
138 && str_contains(
$workflow,
'E-Mail erneut prüfen')
139 && str_contains(
$workflow,
'Zuletzt erfolgreich:')
140 && str_contains(
$javascript,
'markCheckedValuesChanged')
141 && str_contains(
$javascript,
'Werte seit der letzten Prüfung geändert'),
142 'Datenspeicher, E-Mail-Werte und ihr aktueller Prüfstatus müssen eindeutig dargestellt werden.'
145 str_contains(
$workflow,
'storage_advanced_confirm')
146 && str_contains(
$workflow,
'Erweiterte Datenbankauswahl bestätigen')
147 && str_contains(
$workflow,
'auch später in der Administration auswählen')
148 && str_contains(
$workflow,
'Bereits eingerichtete Datenbanken')
149 && !str_contains(
$workflow,
"'Vorhandene Bindungen'")
150 && str_contains(
$javascript,
'data-install-storage-confirm')
151 && str_contains(
$style,
'.dbx-install-storage-confirm'),
152 'PDO und bestehende Datenbankziele benötigen eine verständliche Bestätigung mit DB3 als einfachem Standard.'
155 str_contains(
$workflow,
'if (!$this->stayOnStep)')
156 && str_contains(
$workflow,
'$step === 3 && $action === \'check_database\'')
157 && str_contains(
$workflow,
'$step === 6 && $action === \'check_mail\'')
158 && str_contains(
$workflow,
'mail_test_recipient')
159 && str_contains(
$workflow,
'Empfänger der Test-E-Mail')
160 && str_contains(
$workflow,
'Ohne diese ausdrückliche Auswahl wird keine E-Mail versendet.')
161 && str_contains(
$style,
'.dbx-install-action-group')
162 && str_contains(
$style,
'.dbx-install-check-status'),
163 'Datenbank- und E-Mail-Prüfungen müssen wiederholbar sein, ohne den Installationsschritt zu wechseln.'
169 'Strukturen & Daten',
176 'Installationsschritt fehlt: ' . $stepTitle
180 str_contains(
$workflow,
"patch_local_config('dbx', \$patch)")
181 && str_contains(
$workflow,
"'install' => 0")
182 && !str_contains(
$workflow,
"set_config('dbx', \$config)"),
183 'Installationsabschluss ist nicht ausschließlich lokal/updatefest.'
186 str_contains(
$webApp,
'if ($install || !$ok)')
187 && str_contains(
$webApp,
"\$design = 'dbxapp'")
188 && str_contains(
$webApp,
"\$page = 'install'"),
189 'Installationsrouting reagiert nicht verbindlich auf install=1.'
192 str_contains(
$api,
'if (!$installMode)')
193 && str_contains(
$api,
'check_perma()'),
194 'Bootstrap trennt Installation und Datenbank-/Permalinkauflösung nicht.'
197 str_contains(
$mail,
"array('internal', 'disabled', 'external')")
198 && str_contains(
$mail,
'handle_internal_delivery'),
199 'Globaler E-Mail-Schalter ist nicht vollständig umgesetzt.'
202 substr_count(
$workflow,
"\$current[self::SQL_SERVER]['pass'] ?? ''") >= 2,
203 'Leere Passwortfelder müssen vorhandene SQL- und Mail-Passwörter bewahren.'
206 str_contains(
$workflow,
'$installer->verifyBundledSchema()')
207 && str_contains(
$workflow,
"'read_only' => 1")
208 && str_contains(
$workflow,
'es wurde nichts verändert')
209 && str_contains(
$workflow,
"\$this->actions(4, 'Weiter zur Administration')")
210 && str_contains(
$workflow,
'Danach folgt Schritt 5'),
211 'Der ausgelieferte DB3-Standard muss ohne Schema- oder Datenmutation geprüft werden.'
214 str_contains(
$workflow,
'$this->installer()->ensureInitialAdmin(')
215 && str_contains(
$workflow,
"\$this->postSecret('admin_password'")
216 && str_contains(
$workflow,
"\$this->postSecret('admin_password_repeat'")
217 && str_contains(
$workflow,
'$this->passwordCriteriaMissing(')
218 && str_contains(
$workflow,
'bisherige Passwort des vorhandenen Benutzers')
219 && str_contains(
$workflow,
'Persönlicher Administratorzugang')
220 && str_contains(
$workflow,
'Administratorzugang speichern')
221 && str_contains(
$workflow,
'Persönliches Passwort eingerichtet')
222 && !str_contains(
$workflow,
'admin / 123456 festlegen')
223 && !str_contains(
$workflow,
'Passwortwechsel beim ersten Login erforderlich'),
224 'Schritt 5 muss das persönliche Admin-Passwort zweimal abfragen, prüfen und unmittelbar setzen.'
227 str_contains(
$workflow,
"'password_min_length' => max(")
228 && str_contains(
$workflow,
'Standard: 6 Zeichen')
229 && str_contains(
$workflow,
'12 oder mehr Zeichen empfohlen')
230 && str_contains(
$workflow,
'data-install-password-rules')
231 && str_contains(
$javascript,
'initInstallPasswordRules')
232 && str_contains(
$style,
'.dbx-install-password-rules'),
233 'Die konfigurierbare Passwort-Mindestlänge und ihre Live-Kriterien fehlen im Installer.'
236 str_contains(
$workflow,
'dbx-install-mail-sections')
237 && str_contains(
$workflow,
'data-install-mail-fields')
238 && str_contains(
$workflow,
'box.hidden=')
239 && str_contains(
$style,
'.dbx-install-mail-sections'),
240 'Die E-Mail-Konfiguration muss kompakt gruppiert und nur bei externem Versand sichtbar sein.'
243 str_contains(
$workflow,
'private function fieldTooltip(')
244 && str_contains(
$workflow,
'private function tooltipIcon(')
245 && str_contains(
$workflow,
'data-dbx-tooltip=')
246 && str_contains(
$style,
'.dbx-install-tooltip'),
247 'Installer-Eingabefelder benötigen zentrale, verständliche Tooltips.'
255 'default_design_user',
256 'default_design_admin',
257 'storage_advanced_confirm',
266 'initial_admin_user',
268 'admin_password_repeat',
269 'password_min_length',
284 'mail_test_recipient',
289 str_contains(
$workflow,
"'" . $tooltipField .
"' => '"),
290 'Verständlicher Installer-Tooltip fehlt für: ' . $tooltipField
if(!is_array($rows)) $byId