FAQ · TICKETS · KONTAKT · CHANGELOG

Ein Problem?
Wir sind da.

Durchsuchen Sie die FAQ, öffnen Sie ein Support-Ticket oder kontaktieren Sie uns direkt. Kein Chatbot, keine Warteschlange: Ein Mitarbeiter antwortet Ihnen.

Bevor Sie schreiben — die Antwort ist vielleicht schon hier

Funktionen und Architektur

Technische Fragen zur XDP-Engine, Plugins, Sicherheit, dem Frame-System und den Entwicklungskonventionen von BeamReactor.

Wozu dient frameheader()?+
frameheader() öffnet einen visuellen Abschnitt (Frame) auf der Seite. Sie zeigt den Plugin- oder Abschnittstitel an und erstellt den HTML-Container, in dem der Inhalt gerendert wird. Verwendung: frameheader('Mein Titel', 'h3', false). Die Titelebenen folgen der HTML-Hierarchie: h1 für den Seitentitel (nur einmal), h2 für Hauptabschnitte, h3 und darüber für Frames und Widgets. Ein direkt aufgerufenes Plugin muss beginnen mit: if($obj=='mein_plugin.php') frameheader($dialplugindisplay); — diese Bedingung verhindert die doppelte Header-Anzeige, wenn das Plugin von einem anderen Skript eingebunden wird.
Wann sollte ich framefooter() verwenden?+
framefooter() schließt den von frameheader() geöffneten Frame. Sie ist erforderlich, bevor ein neuer Abschnitt mit frameheader() geöffnet wird. Rufen Sie framefooter() nie ohne ein folgendes frameheader() auf, außer am Seitenende. Das Standardmuster für die Strukturierung einer Seite in mehrere Blöcke: frameheader('Abschnitt 1'); /* Inhalt */ framefooter(); frameheader('Abschnitt 2'); /* Inhalt */. Die Engine übernimmt das abschließende Schließen automatisch.
Wie strukturiere ich eine Seite mit mehreren Abschnitten?+
Verwenden Sie das Paar framefooter() / frameheader(), um Abschnitte zu verketten. Jeder Abschnitt erstellt einen eigenständigen visuellen Block mit eigenem Titel. Beispiel: Nach dem Anzeigen eines Formulars und einem Fehler schließen Sie den aktuellen Frame mit framefooter(), öffnen einen neuen sauberen Frame mit frameheader(''), binden das Formular erneut ein und machen return. So bleibt der Benutzer auf einer gültigen, korrekt gerahmten Seite ohne HTTP-Weiterleitung.
Wie funktioniert secure()?+
secure() prüft, ob die Stufe des eingeloggten Benutzers für den Zugriff auf eine Ressource ausreicht. Sie nimmt eine Stufenkonstante als Parameter (BASE_LEVEL_ADMIN, PLUGIN_LEVEL_MODERATOR, usw.) und gibt true oder false zurück. Das Standardmuster: frameheader($dialplugindisplay); if(!secure(PLUGIN_LEVEL_MODERATOR)) { forbids(); return; }. Der Frame wird VOR der Prüfung geöffnet — forbids() wird im Frame angezeigt, sonst bricht das Layout. Der Trick secure(0) prüft einfach, ob der Benutzer überhaupt eingeloggt ist.
Welche Includes sollte ich in einem Plugin verwenden?+
Keine für Konfiguration und Bibliotheken — die XDP-Engine lädt sie automatisch. Das einzig erlaubte Include ist für die Locale: include(getlocale('plugin_name'));. Dateien mit .conf.inc.php und .lib.inc.php werden von der Engine erkannt und geladen. Manuelles require oder include für Konfiguration oder Libs verursacht eine Warnung und einen fehlerhaften Pfad. Ebenso niemals ein Modul (.mod.php) einbinden — sie werden ausschließlich über ?obj=name.mod aufgerufen.
Wie funktionieren Übersetzungen in einem Plugin?+
Jedes Plugin hat seine Übersetzungsdateien in /locale/plugin_name.XX.inc.php (XX = ISO-Sprachcode). Das Laden erfolgt über include(getlocale('plugin_name'));, das VOR frameheader() aufgerufen werden muss, um Fehler durch fehlende Variablen zu vermeiden. Übersetzungen verwenden ein Array $dialpluginname[]. $dialplugindisplay enthält den angezeigten Plugin-Titel, $dialplugincall den Namen im Kontrollzentrum. getAvailableLanguages() gibt die Liste der verfügbaren Sprachen zurück.
Wie lade ich plugin-spezifisches CSS oder JavaScript?+
Verwenden Sie die globale Variable $headdata zur Injektion in <head>: $headdata .= '<link rel="stylesheet" type="text/css" href="plugins/mein_plugin/css/mein_plugin.css">'; Für JavaScript dasselbe Prinzip: $headdata .= '<script src="plugins/mein_plugin/js/mein_plugin.js"></script>'; Um JS nach dem DOM auszuführen, verwenden Sie $footdata mit einem Heredoc. CSS muss die in core.css definierten Variablen verwenden — niemals Farben erfinden. Wenn eine Variable fehlt, schlagen Sie vor, sie zu core.css hinzuzufügen.
Wie validiere ich Benutzereingaben?+
Verwenden Sie den Sanitizer: use Beamreactor\Sanitizer\Parser; dann Parser::sanitize($input, 'type'). Verfügbare Typen: bool, date, email, name, html, xml, uuid, url, string, ip, float, int, path und andere. sanitize() bereinigt und validiert die Daten und gibt false zurück, wenn ungültig. check() prüft das Format ohne zu bereinigen. Immer VOR jeder SQL-Operation sanitizen. Niemals einen Datentyp erfinden — schlagen Sie einen vor, wenn nötig.
Wie interagiere ich mit der Datenbank?+
Verwenden Sie die SQL-Klasse: use Beamreactor\Database\SQL;. Hauptmethoden: SQL::query() für mehrere Zeilen, SQL::queryFirst() für eine einzelne Zeile, SQL::queryValue() für einen einzelnen Wert, SQL::insertRow() zum Einfügen, SQL::updateRow() zum Aktualisieren, SQL::deleteRow() zum Löschen. Verwenden Sie immer Prepared Statements mit ?-Parametern. Direkte Variablenverkettung in SQL ist strikt verboten. Prüfen Sie die Datenbankverfügbarkeit mit isset($cfg['dbtable']) und die Tabellenexistenz mit SQL::tableExists().
Wie erstelle ich einen AJAX-Endpoint?+
Module (.mod.php) sind die AJAX-Endpoints von BeamReactor. Sie antworten mit JSON, XML, HTML oder Text. Sie gehören in /handlers/plugin_name.mod.php und werden über ?obj=plugin_name.mod aufgerufen (ohne .php). Niemals den vollständigen Dateipfad aufrufen. Minimalstruktur: frameheader-Prüfung, Sicherheit über secure(), Content-Type-Header, Aktionsverarbeitung über Parser::sanitize(), JSON-Antwort mit ['success' => !!1] oder ['success' => !!0]. Auf der JavaScript-Seite erfolgt der Aufruf mit $.post(BEAM_BASE_URL + '?obj=plugin_name.mod', {...}).
Wie funktioniert das Seiten-Routing?+
Alles in BeamReactor läuft über index.php. Der Parameter ?obj= bestimmt, was geladen wird. Ein Plugin: ?obj=mein_plugin.php. Ein AJAX-Modul: ?obj=mein_plugin.mod. Ein Dokument: ?obj=meine_seite.dta. Die XDP-Engine löst den Pfad auf, lädt Konfiguration, Bibliotheken und Locale automatisch und führt das Skript in einer gesicherten Umgebung aus. Kein PHP-Skript kann direkt aufgerufen werden — alles läuft über die Engine.
Wie zeige ich dem Benutzer Benachrichtigungen an?+
BeamReactor verfügt über ein Toast-System mit 6 Stufen: debug (0), info (1), success (2), warning (3), error (4), critical (5). Schnelle Verwendung: Toast::info('Titel', 'Nachricht', 5000); oder Toast::add(Toast::LEVEL_WARNING, 'Titel', 'Nachricht', BASE_LEVEL_USER, 0). Der Parameter minUserLevel richtet Benachrichtigungen nach Zugangsstufe. Dauer in Millisekunden, 0 für dauerhaft.
Wie ist die Struktur eines BeamReactor-Plugins?+
Ein Plugin ist ein eigenständiger Ordner in /plugins/plugin_name/ mit: plugin_name.php (Hauptschnittstelle), /conf/ (automatisch geladene Konfiguration), /lib/ (automatisch geladene Bibliotheken), /locale/ (Übersetzungen pro Sprache), /handlers/ (AJAX-Endpoints .mod.php), /css/, /js/, /images/, /sql/ (Tabelleninstallation), /tests/, /doc/ (Dokumentation .md und Hilfe .help.json), und /data/cache/ für persistente Daten. Installation bedeutet den Ordner ablegen. Entfernung bedeutet ihn herausnehmen.
Wie zeige ich JavaScript-Dialoge in BeamReactor an?+
BeamReactor ersetzt die nativen alert/confirm/prompt durch benutzerdefinierte Dialoge in javascript/dialogs.js.php. Vier Funktionen: alertWindow('Titel', 'Nachricht') für Alarme, confirmWindow('Titel', 'Frage?', {}, callback) für Bestätigungen, promptWindow('Titel', 'Label:', {}, callback) für Eingaben, infoWindow('Titel', 'Info') für Informationen. Niemals native alert(), confirm() oder prompt() verwenden.
Wie übergebe ich PHP-Übersetzungen an JavaScript?+
Definieren Sie in der Plugin-Locale-Datei ein Array $js_translations und rufen Sie setJavascriptLocale($js_translations) auf. Beispiel: $js_translations = ['mein_plugin' => ['error_msg' => $dialmeinplugin[5]], 'global' => ['error' => $dial[32]]]; setJavascriptLocale($js_translations);. Auf der JavaScript-Seite greifen Sie über PLUGIN_TRANSLATION.mein_plugin.error_msg auf die Übersetzungen zu. Die Übersetzungen werden als globales JavaScript-Objekt in den Head injiziert.
Kann ich exit oder die in einem Plugin verwenden?+
Nein. Plugins dürfen niemals exit oder die verwenden. Das einzig erlaubte die im gesamten Plugin-Code ist if(!function_exists('frameheader')) die('forbidden'); in der ersten Zeile, das den BeamReactor-Kontext überprüft. Um die Ausführung zu stoppen, verwenden Sie return. Um einen Fehler zu behandeln, zeigen Sie die Nachricht im Frame an und machen dann return. Wenn ein Plugin exit oder die verwendet, kann die Engine nicht feststellen, was fehlgeschlagen ist, und die Diagnose wird unmöglich.
Wie funktionieren die Sicherheitsstufen?+
BeamReactor verwendet eine feste Hierarchie: OVERMIND > ADMIN > MODERATOR > HIGHUSER > USER. BASE_LEVEL_*-Konstanten sind in cog.inc.php definiert. Jedes Plugin kann eigene Stufen über PLUGIN_NAME_LEVEL_* in seiner Konfiguration definieren. $basedisplevel verwendet immer BASE_LEVEL_*, niemals PLUGIN_LEVEL_*. Benutzerdefinierte define()-Aufrufe kommen nach $basedisplevel. Das System vervollständigt fehlende Stufen automatisch über base_user_levels().
Wie funktioniert das automatische Laden von Klassen?+
Dateien mit .lib.inc.php und .conf.inc.php werden automatisch von der Engine geladen. Für zusätzliche Klassen registrieren Sie einen PSR-4-Autoloader in der Plugin-Konfiguration mit spl_autoload_register(). Der Namespace folgt der Konvention Beamreactor\PluginName\. Klassendateien gehören in /lib/ und werden über den relativen Pfad zum Namespace aufgelöst. Dies ermöglicht es mehreren Plugins, ohne Namenskollisionen nebeneinander zu bestehen.

Zwei-Faktor-Authentifizierung (2FA)

Sie fügt eine unverzichtbare Schutzebene hinzu, indem sie einen zusätzlichen Identitätsnachweis verlangt. Sie stellt sicher, dass ein Dritter selbst bei gestohlenem Passwort nicht auf Ihre Daten zugreifen kann. Sie ist die wirksamste Abwehr gegen Identitätsdiebstahl und das Hacken von Konten.

Wie aktiviere ich die Zwei-Faktor-Authentifizierung?+
Um Ihr Konto abzusichern, sind zwei Schritte nötig. Registrierte Benutzer melden sich zunächst an der Hauptoberfläche von BeamReactor an. Mit einem Klick auf die Schaltfläche „Profil“ oben links gelangen Sie zu Ihrem Profil. Unten finden Sie einen 2FA-QR-Code, den Sie mit einer App wie Google Authenticator oder Microsoft Authenticator scannen. Anschließend erhalten Sie Backup-Codes: Notieren Sie sie sorgfältig, damit Sie Ihr Konto bei Verlust oder Diebstahl Ihres Telefons wiederherstellen können.
Wie melde ich mich mit der Zwei-Faktor-Authentifizierung an?+
Melden Sie sich mit Ihrem Benutzernamen und Passwort auf der BeamReactor-Website an. Das System fordert Sie anschließend auf, einen Code einzugeben, den Sie in der Authenticator-App Ihres Telefons finden.
Welche Voraussetzungen gibt es?+
Aktualisieren Sie das Betriebssystem Ihres Telefons und die App Google oder Microsoft Authenticator auf die neueste Version. Wenn Sie sich nicht anmelden können, aber noch Zugriff auf die E-Mail-Adresse Ihres Kontos haben, versuchen Sie, Ihr Passwort zu ändern. Ohne Zugriff auf Ihre E-Mails kontaktieren Sie uns über das Support-Formular.
Und wenn ich mein Passwort vergessen habe?+
Sie können es jederzeit zurücksetzen, indem Sie auf der Anmeldeseite auf den Link „Konto nicht zugänglich?“ klicken.
Und wenn mein Telefon verloren oder kaputt ist?+
Verwenden Sie einen der Backup-Codes, die Sie bei der 2FA-Einrichtung erhalten haben. Klicken Sie auf der Authentifizierungsseite auf „Backup-Code“, geben Sie ihn ein und aktualisieren Sie nach der Anmeldung Ihre 2FA-Einstellungen in Ihrem Profil.
Und wenn ich mein Telefon oder System wechsle?+
Neues Gerät, neues System, Neuinstallation nach einer Formatierung: Das Vorgehen ist dasselbe wie bei einem verlorenen Telefon. Melden Sie sich mit Ihren Backup-Codes an und synchronisieren Sie dann Ihr neues Gerät über Ihr Benutzerprofil.
Warum wird die Zwei-Faktor-Authentifizierung eingesetzt?+
Die Zwei-Faktor-Authentifizierung (2FA) fügt eine unverzichtbare Schutzebene hinzu, indem sie einen zusätzlichen Identitätsnachweis verlangt. Sie stellt sicher, dass ein Dritter selbst bei gestohlenem Passwort nicht auf Ihre Daten zugreifen kann. Sie ist die wirksamste Abwehr gegen Identitätsdiebstahl und das Hacken von Konten.

Benötigen Sie persönliche Hilfe?

Ticketing — Für registrierte Benutzer. Öffnen Sie ein Ticket, verfolgen Sie seinen Fortschritt und kommunizieren Sie mit dem technischen Support. Ihr Verlauf wird gespeichert.

Direktkontakt — Für kommerzielle Anfragen, Partnerschaften oder Fragen vor dem Kauf. Kein Konto erforderlich.
Kontaktformular →

Aktueller Changelog

- October 3, 2026, 4:27 am: Mise à jour de l'outil MCP read_features, permettant de récuperer jusqu'a 50 tickets features par type, séverité. Correction des calls vers "level(" dans les outils MCP qui n'étaient pas tous en corrélation avec le plugin utilisé ou utilisaient des valeurs numériques (prohibées, patch de flemmasse). Introduction de l'outil MCP dump_schema.lib.inc.php.
- October 3, 2026, 3:34 am: Correction de l'outil MCP write_features (int/string) + ajout des points agile/fibonacci, de la catégorie
- October 1, 2026, 10:14 pm: Chaque lecture de fichier vérifie son résultat : un échec est signalé (trigger_error, message visible), jamais étouffé. is_readable() avant la lecture ne suffit pas (le fichier peut changer entre les deux, et il faut vérifier le retour de toute façon). Lot 1 fait le 30/09/2026 : les 18 @file_get_contents (audit, llm_rag, llmrag_ia, ClassMapScanner, CAPCache, VIES, VisionHelper). Reste : les ~110 autres lectures, plugin par plugin. — Texte d’origine (2004) : Ajouter is_readable() pour chaque fichier en lecture - DONE (features)
- October 1, 2026, 9:36 pm: Mettre la fonction de reconnaissance d'un bot dans la lib de securité. L'installer dans banna. Automatiser la function de reconnaissance de robots, en sql (harmless to harmful, spider, crawler, spam, stealer, etc) - DONE (features)
- October 1, 2026, 9:23 pm: Discard ou replace document si document deja present dans data - DONE (features)
- October 1, 2026, 3:46 pm: Limiter les acces a la BDD au strict minimum avec la fonction connection(); - DONE (features)
- October 1, 2026, 3:42 pm: Etudier la possibilité de faire un cache des plugins. - DONE (features)
- October 1, 2026, 3:26 pm: Multi currency pricing - DONE (features)
- October 1, 2026, 3:23 pm: newsletter/mailer-daemon html. - DONE (features)
- October 1, 2026, 2:51 pm: lib/sanitizer/Datatypes/wip/DatatypeHash.php : erreur de syntaxe (deux php de suite). Le scanner de classes parcourt wip/ (work in progress): Parser::sanitize($x, 'hash') chargerait ce fichier et pourrait potentiellement faire tomber le systeme même si personne ne l'appelle aujourd'hui. - DONE (features, 1 pts)
- October 1, 2026, 2:50 pm: #176 lot C : 19 scandir non vérifiés (liste dans la section 9 de l'audit) - foreach sur false = warning, array_diff(false) / [] + false = fatal en PHP 8 (diskmaster, edito.lib, login_success sont les fatals). - DONE (features, 3 pts)
- October 1, 2026, 1:57 pm: Silent failures hunted down (a 2005 request that was still relevant): every directory or file opening that could white-screen a page under PHP 8 is now checked, from the plugin list itself to the page cache, and settings that could not be read no longer fall back to defaults without a word. Two of them hid real damage: an unreadable database migration was recorded as applied without running, and adding a line to the history could overwrite the whole file. New event log: who banned, anonymized or exported whom, and who installed which plugin, kept one month and readable by site administrators in the Errors and events page. Moderation actions now require a security token: a booby-trapped image could make a moderator ban or anonymize someone, or make any member anonymize their own account. The error detail view no longer runs code hidden in an error message. The GDPR page buttons work again, and the GDPR export includes editorials and notepads again. The audit now finds files that no longer load and unchecked directory openings; its first run repaired the subscribers and quick links plugins.
- September 30, 2026, 6:02 pm: New imagesort plugin: sorts image folders with a local vision model (MiniCPM-V), recursively, from a source to a destination picked at each run under allowed roots. It classifies first and moves nothing, resumes where it stopped, and shows a review page with thumbnails where any category can be corrected; the categories are a base list plus a simple CSV. Moving is journaled and a whole batch can be undone; an identical file already at the destination (same MD5) counts as a duplicate, anything else gets a free name, a copy between drives is checked before the source is deleted, and no metadata is ever written. File reads that fail are no longer silent (first batch of an old 2004 request): the audit reports unreadable files as not audited instead of clean, and its check of the required member files finally reads the right path; the class map, the CAP cache, the VIES VAT check and the vision helper now report their failures. RAG sources given as a URL accept web addresses only (http/https): a local path could be read as a source by an administrator. JSON endpoints no longer get a warning printed into their response.
- September 30, 2026, 5:58 pm: Ajouter is readable a chaque opendir (cf versions.php 0.94 18.09.2005) - DONE (features)
- September 30, 2026, 3:25 pm: Location, for GMT values and hour relative listings and data supplying. - DONE (features)
- September 30, 2026, 3:23 pm: Add avatar - DONE (features)
- September 30, 2026, 3:23 pm: Gallery : target image inclusion within the current theme - DONE (features)
- September 30, 2026, 3:23 pm: base skin detection and creation - DONE (features)
- September 30, 2026, 3:05 pm: BeamReactor 3.0.0-alpha. Member panel diagnostics: each plugin reports from its own dashboard/ folder (counts by severity, "new since your last visit", filtered by level and group) - support tickets, orders, abuse, moderation, scheduler, error logs, calendar, LLM health, bans and reminders, and today the todo list (critical, due within 48 h, open) and the feature requests (blocking, never triaged, in progress). A single version source, core files flagged in the update manifest, and the updater opened to site owners. Foldable frames and title widgets are back without breaking older skins; skin translations move to skinlocale files. RTE 4.3: an emoji button, and a Versions button that reloads any of the last five saved versions of content, blogs, editorials and documents; embedding plugins is reserved to webmasters, with a recursion guard. MCP: the model keeps a notebook of its own (30 notes per user and per model), RAG excerpts name their source, the vector index was repaired, conversations are partitioned per user, the user's request never falls out of the context window, fake turns written by the model are cut and tool loops stop; web_fetch reads the main content in UTF-8, with an offset for long pages, and the sanitizer encodes non-ASCII URLs instead of truncating them. Feature requests gained categories, sortable headers, one-click unfeasible and cancelled states, Fibonacci complexity points with a WSJF sort, a Back link that returns where you were, and list views (blocking, never triaged, in progress) that the member panel opens directly; their write actions are now restricted to moderators (deletion to admins) and carry action tokens - marking a request as done was not checked at all. Cron handlers finally delivered for the defense-log and statistics purges, SQL Operations repairs tables according to their engine, a stored script injection in the oneliner is fixed, and a dozen lookups no longer crash on a missing row.
- September 27, 2026, 9:22 pm: URGENT aegis-ia : routeur user/data/tos.php sur le modèle de user/data/home.php de dev (include de tos_<langue>.html, erreur visible si la langue manque) ; le footer de la skin aegis pointe ensuite sur ?obj=tos.php au lieu de tos_php echo $cfg[22] .html (2 liens), et les og:url des CGU (cgv.html / tos.html, pages mortes) sur la vraie adresse. - DONE (features, 2 pts)
- September 24, 2026, 10:33 pm: Ajouter le niveau de complexité (barres de couleur dans la liste!) - delai necessaire dans features - DONE (features)
- September 24, 2026, 10:32 pm: Regrouper les listes d'ips bannies de chaque site SDP/XDP (export data) - DONE (features)
- September 24, 2026, 10:32 pm: Moteur de recherche HS si page >1 - DONE (features)
- September 24, 2026, 10:28 pm: <!--<a href=spider.php3>.</a>--> - DONE (features)
- September 24, 2026, 10:26 pm: plugin : pense bete - DONE (features)
- September 24, 2026, 10:25 pm: Notice: Undefined index: type in /home/artsonne/public_html/beamreactor.com/plugins/products_editor.php on line 173 Notice: Undefined variable: displaystatus in /home/artsonne/public_html/beamreactor.com/plugins/products_editor.php on line 173 - DONE (features)
- September 24, 2026, 10:23 pm: Laisser le user acceder au documents figés lorsque la base de données est down, mais afficher le 503 en cas d'acces a la BDD - DONE (features)
- September 24, 2026, 10:05 pm: Add repair table in the mysql operqtions plugin - DONE (features)
- September 24, 2026, 9:53 pm: in sponsors, entering a wrong web address ruins any UTF8 text typed in the comment field - DONE (features)
- September 24, 2026, 9:46 pm: feature: edit the request: buttons broken - DONE (features)

Vollständige Historie →

Keine Antwort gefunden?

Öffnen Sie ein Ticket oder nehmen Sie Kontakt auf.