[ 'label' => 'Ueberblick', 'title' => 'Depot-Ueberblick', 'description' => 'Kennzahlen, Kursverlauf und Performance fuer das ausgewaehlte Depot.', 'nav_description' => 'Marktueberblick, Positionen und gespeicherte Kurse.', ], 'depotverwaltung' => [ 'label' => 'Depotverwaltung', 'title' => 'Depotverwaltung', 'description' => 'Depots, Positionen und manuelle Kursdaten zentral verwalten.', 'nav_description' => 'Depots pflegen, FX abrufen und Positionen bearbeiten.', ], 'aktienverwaltung' => [ 'label' => 'Aktienverwaltung', 'title' => 'Aktienverwaltung', 'description' => 'Wertpapier-Stammdaten, Suche und Kursverlauf pro Aktie pflegen.', 'nav_description' => 'Ticker, ISIN, Markt und Kursverlauf pro Instrument.', ], 'setup' => [ 'label' => 'Setup', 'title' => 'Setup', 'description' => 'API-Zugaenge, Datenbankoptionen und Modulvorgaben verwalten.', 'nav_description' => 'Schluessel, Timeouts und Modulkonfiguration speichern.', ], ]; $assetVersion = static function (string $relativePath): string { $fullPath = dirname(__DIR__) . '/' . ltrim($relativePath, '/'); $mtime = is_file($fullPath) ? filemtime($fullPath) : false; return $mtime === false ? '0' : (string) $mtime; }; $renderSetup = static function (): void { $moduleName = 'boersenchecker'; $manifestPath = dirname(__DIR__) . '/module.json'; $manifestRaw = is_file($manifestPath) ? file_get_contents($manifestPath) : false; $manifest = is_string($manifestRaw) && trim($manifestRaw) !== '' ? json_decode($manifestRaw, true) : []; $fields = is_array($manifest['setup']['fields'] ?? null) ? $manifest['setup']['fields'] : []; $settings = modules()->settings($moduleName); $notice = null; $error = null; $getValue = static function (array $source, string $path): mixed { $value = $source; foreach (explode('.', $path) as $segment) { if (!is_array($value) || !array_key_exists($segment, $value)) { return null; } $value = $value[$segment]; } return $value; }; $setValue = static function (array &$target, string $path, mixed $value): void { $segments = explode('.', $path); $cursor = &$target; foreach ($segments as $index => $segment) { if ($index === count($segments) - 1) { $cursor[$segment] = $value; return; } if (!isset($cursor[$segment]) || !is_array($cursor[$segment])) { $cursor[$segment] = []; } $cursor = &$cursor[$segment]; } }; if ($_SERVER['REQUEST_METHOD'] === 'POST' && (string) ($_POST['action'] ?? '') === 'save_setup') { try { $nextSettings = $settings; foreach ($fields as $field) { if (!is_array($field)) { continue; } $name = trim((string) ($field['name'] ?? '')); $type = trim((string) ($field['type'] ?? 'text')); if ($name === '') { continue; } $raw = $_POST['settings'][$name] ?? null; $value = match ($type) { 'checkbox' => $raw !== null, 'number' => ($raw === null || $raw === '') ? null : (is_numeric((string) $raw) ? 0 + $raw : null), default => is_string($raw) ? trim($raw) : '', }; $setValue($nextSettings, $name, $value); } modules()->saveSettings($moduleName, $nextSettings); $settings = modules()->settings($moduleName); $notice = 'Setup gespeichert.'; } catch (\Throwable $e) { $error = $e->getMessage(); } } ?>

Modul-Setup

Die Felder entsprechen dem alten Nexus-Modul und werden lokal in `data/module-settings/boersenchecker.json` gespeichert.

'/apps/boersenchecker/index.php?view=overview', 'depotverwaltung' => '/apps/boersenchecker/index.php?view=depotverwaltung', 'aktienverwaltung' => '/apps/boersenchecker/index.php?view=aktienverwaltung', 'setup' => '/apps/boersenchecker/index.php?view=setup', ]; ob_start(); if ($view === 'setup') { $renderSetup(); } elseif ($view === 'depotverwaltung') { $page = new \Modules\Boersenchecker\Support\DashboardPage(); module_tpl('boersenchecker', 'dashboard', $page->handle()); } elseif ($view === 'aktienverwaltung') { $page = new \Modules\Boersenchecker\Support\InstrumentPage(); module_tpl('boersenchecker', 'instruments', $page->handle()); } else { $page = new \Modules\Boersenchecker\Support\HomePage(); module_tpl('boersenchecker', 'home', $page->handle()); } $innerContent = (string) ob_get_clean(); ?>

Boersenchecker

Desktop-App Legacy-Migration View:
Börsenchecker