14require_once dirname(__DIR__, 2) .
'/vendor/autoload.php';
15require_once dirname(__DIR__) .
'/dbxKernel.php';
17dbx()->get_system_obj(
'dbxForm',
'load');
18dbx()->get_system_obj(
'dbxReport',
'load');
20$fail =
static function (
string $message): void {
21 fwrite(STDERR,
"FAIL: {$message}\n");
25$moduleRoot = dirname(__DIR__, 2) . DIRECTORY_SEPARATOR .
'modules';
28 new RecursiveDirectoryIterator(
$moduleRoot, FilesystemIterator::SKIP_DOTS)
32 $path = str_replace(
'\\',
'/',
$file->getPathname());
35 !str_contains($path,
'/fd/') ||
36 str_contains($path,
'/fd/_backup/') ||
37 !str_ends_with($path,
'.fd.php')
42 $name =
$file->getFilename();
44 if (preg_match(
'/_(de|en|es)\.fd\.php$/', $name, $match)) {
47 $base = preg_replace(
'/_(de|en|es)\.fd\.php$/',
'.fd.php', $name);
48 $key = str_replace(
'\\',
'/',
$file->getPath()) .
'/' .
$base;
53 $fail(
'Keine FD-Dateien gefunden.');
58 'save_success' =>
'Daten wurden gespeichert',
59 'save_error' =>
'Daten konnten nicht gespeichert werden',
62 'save_success' =>
'Data was saved',
63 'save_error' =>
'Data could not be saved',
66 'save_success' =>
'Los datos se guardaron',
67 'save_error' =>
'Los datos no se pudieron guardar',
71$readFd =
static function (
string $path): array {
87 'label',
'tooltip',
'errormsg',
'placeholder',
88 'prompt',
'hint',
'options',
'data',
'group',
90 $germanWords =
'~\b(?:'
91 .
'Daten|Bitte|nicht|keine?|konnten|wurde[n]?|gespeichert|'
92 .
'Speichern|Löschen|gelöscht|Benutzer|Kunde|Rechnung|'
93 .
'Rechnungsnummer|Artikel|Bestellung|Beschreibung|Bezeichnung|'
94 .
'auswählen|ausgewählt|aufsteigend|absteigend|Rolle[n]?|'
95 .
'Gruppe[n]?|verfügbar|verwenden|aktivieren|deaktivieren|'
96 .
'erlauben|eingeben|ungültig|erforderlich|Seite[n]?|Sprache|'
97 .
'Deutsch|Entwurf|Offen|Bezahlt|Zeilen|Sortierung|Suche|'
98 .
'Erstellen|Ändern|Bearbeiten|Zurück|Nein|Ja|Vorkasse|'
99 .
'Ueberweisung|Überweisung|Strasse|Straße|PLZ|Ort|Land|Summe|'
100 .
'Betreff|Rueckfrage|Rückfrage|Anfrage[n]?|Nachricht|'
101 .
'entfernen|ausblenden|hinzufuegen|hinzufügen'
104 $scan =
static function (
107 ) use (&$scan, $germanWords,
$fail, $path):
void {
109 foreach (
$value as $key => $nested) {
110 $scan($nested, $location .
'/' . (
string)$key);
116 preg_match($germanWords, html_entity_decode(
$value, ENT_QUOTES), $match)
119 "{$path}: deutscher UI-Text '{$match[0]}' "
126 foreach ($uiKeys as $key) {
127 if (array_key_exists($key,
$field)) {
128 $scan(
$field[$key],
"Feld {$position}/{$key}");
135foreach (
$groups as $key => $variants) {
136 if (!isset($variants[
'neutral']) && !isset($variants[
'de'])) {
137 $fail(
"Deutsche/neutrale Basis-FD fehlt: {$key}");
139 foreach (array(
'en',
'es') as $language) {
140 if (!isset($variants[$language])) {
141 $fail(
"Sprachversion {$language} fehlt: {$key}");
145 $sourcePath = $variants[
'de'] ?? $variants[
'neutral'];
146 $sourceFd =
$readFd($sourcePath);
147 $sourceFields = $sourceFd[
'fields'];
148 $sourceMessageKeys = array_keys($sourceFd[
'messages']);
149 sort($sourceMessageKeys);
150 foreach ($variants as $variant => $path) {
151 $language = in_array($variant, array(
'en',
'es'),
true) ? $variant :
'de';
154 foreach (
$expected[$language] as $messageKey => $message) {
155 if ((
$messages[$messageKey] ??
null) !== $message) {
156 $fail(
"{$path}: {$messageKey} ist nicht korrekt lokalisiert.");
160 $fail(
"{$path}: Kompatibilitätsalias save_succeass fehlt.");
163 if (in_array($variant, array(
'en',
'es'),
true)) {
166 if ($messageKeys !== $sourceMessageKeys) {
168 "{$path}: Meldungsschlüssel weichen von der "
173 if (count(
$fd[
'fields']) !== count($sourceFields)) {
174 $fail(
"{$path}: Feldanzahl weicht von der deutschen FD ab.");
176 $structuralKeys = array(
177 'name',
'type',
'index',
'length',
'default',
'rules',
178 'convert',
'protect',
'mask',
'tpl',
'js',
180 foreach ($sourceFields as $position => $sourceField) {
181 $targetField =
$fd[
'fields'][$position] ?? array();
182 foreach ($structuralKeys as $fieldKey) {
184 ($sourceField[$fieldKey] ??
null)
185 !== ($targetField[$fieldKey] ??
null)
188 "{$path}: Feld {$position}/{$fieldKey} "
189 .
'weicht strukturell von der deutschen FD ab.'
206 $fail(
'dbxForm lädt die englische FD oder ihre Meldungen nicht.');
218 $fail(
'load_fd_messages() lädt die spanische FD nicht feldfrei.');
222 'record' =>
'Datensatz #{id}: {name}',
227 array(
'id' => 17,
'name' =>
'Test')
228 ) !==
'Datensatz #17: Test'
230 $fail(
'format_fd_message() ersetzt benannte FD-Platzhalter nicht.');
236 $form->_messages !== array() ||
237 $form->_msg_success !==
'#form_msg_success#' ||
238 $form->_msg_error !==
'#form_msg_error#'
240 $fail(
'dbxForm-Reset behält Meldungen einer vorherigen FD.');
242$form->_dbx_modul =
'myInvoices';
243$form->_dbx_lng =
'en';
245if (
$form->get_fd_message(
'save_succeass') !==
$expected[
'en'][
'save_success']) {
246 $fail(
'dbxForm übernimmt FD-Meldungen nicht aus dem Cache.');
266if (!
$form->save_post(
'test|record', 1,
'', 0)) {
267 $fail(
'Test-DB-Stellvertreter meldet im Erfolgspfad einen Fehler.');
270 $fail(
'dbxForm verwendet save_success aus der englischen FD nicht.');
274$form->_dbx_modul =
'myInvoices';
275$form->_dbx_lng =
'es';
280if (
$form->save_post(
'test|record', 1,
'', 0)) {
281 $fail(
'Test-DB-Stellvertreter meldet im Fehlerpfad Erfolg.');
287 $fail(
'dbxForm verwendet save_error aus der spanischen FD nicht.');
291$report->_dbx_modul =
'myInvoices';
293$report->_fd =
'myInvoices|invoice-form';
298$report->save_post(
'test|record', 1,
'', 0);
300 $fail(
'dbxReport erbt die FD-Speichermeldungen nicht von dbxForm.');
304 .
" FD-Gruppen sind dreisprachig; dbxForm und dbxReport verwenden ihre FD-Meldungen.\n";
if((string)($formActionPolicy['action'] ?? '') !=='dbxAction.save'||!dbx() ->check_action_token((string)($formActionPolicy['scope'] ?? ''),(string)($formActionRoute['params']['dbx_token'] ?? ''))) $report
foreach( $valid as $email) foreach($invalid as $email) $fd
DBX schema administration.