En vous promenant sur Beamreactor, nous stockons votre IP 48h pour des raisons de sécurité.
FAQ · TICKETS · CONTACT · CHANGELOG

Un problème ?
On est là.

Consultez la FAQ, ouvrez un ticket de support, ou contactez-nous directement. Pas de chatbot, pas de file d'attente: un opérateur vous répond.

Avant d'écrire, la réponse est peut-être ici

Fonctions et architecture

Questions techniques sur le moteur XDP, les plugins, la sécurité, le système de frames et les conventions de développement BeamReactor.

À quoi sert frameheader() ?+
frameheader() ouvre une section visuelle (frame) dans la page. Elle affiche le titre du plugin ou de la section et crée le conteneur HTML dans lequel le contenu sera rendu. Usage : frameheader('Mon titre', 'h3', false). Les niveaux de titre suivent la hiérarchie HTML : h1 pour le titre de page (une seule fois), h2 pour les sections principales, h3 et au-delà pour les frames et widgets. Un plugin appelé directement doit commencer par : if($obj=='mon_plugin.php') frameheader($dialplugindisplay); — cette condition évite le double affichage du header quand le plugin est inclus depuis un autre script.
Quand utiliser framefooter() ?+
framefooter() ferme la frame ouverte par frameheader(). Elle est indispensable avant d'ouvrir une nouvelle section avec frameheader(). Ne jamais appeler framefooter() sans un frameheader() qui suit, sauf en fin de page. Le pattern classique pour structurer une page en plusieurs blocs : frameheader('Section 1'); /* contenu */ framefooter(); frameheader('Section 2'); /* contenu */. Le moteur gère la fermeture finale automatiquement.
Comment structurer une page en plusieurs sections ?+
Utilisez la paire framefooter() / frameheader() pour enchaîner les sections. Chaque section crée un bloc visuel distinct avec son propre titre. Exemple : après avoir affiché un formulaire et reçu une erreur, fermez la frame courante avec framefooter(), ouvrez une nouvelle frame propre avec frameheader(''), incluez le formulaire à nouveau, puis faites return. Cela maintient l'utilisateur dans une page valide et encadrée sans redirection HTTP.
Comment fonctionne secure() ?+
secure() vérifie si le niveau de l'utilisateur connecté est suffisant pour accéder à une ressource. Elle prend en paramètre une constante de niveau (BASE_LEVEL_ADMIN, PLUGIN_LEVEL_MODERATOR, etc.) et retourne true ou false. Le pattern standard : frameheader($dialplugindisplay); if(!secure(PLUGIN_LEVEL_MODERATOR)) { forbids(); return; }. La frame est ouverte AVANT la vérification — forbids() s'affiche dans la frame, sinon le layout est cassé. L'astuce secure(0) vérifie simplement si l'utilisateur est connecté.
Quels includes utiliser dans un plugin ?+
Aucun pour la config et les librairies — le moteur XDP les charge automatiquement. Le seul include autorisé est celui de la locale : include(getlocale('nom_du_plugin'));. Les fichiers .conf.inc.php et .lib.inc.php sont détectés et chargés par le moteur. Faire un require ou include manuel pour la config ou les libs provoquera un warning et un chemin cassé. De même, ne jamais inclure un module (.mod.php) — ils sont appelés exclusivement via ?obj=nom.mod.
Comment fonctionnent les traductions dans un plugin ?+
Chaque plugin a ses fichiers de traduction dans /locale/nom_du_plugin.XX.inc.php (XX = code langue ISO). Le chargement se fait via include(getlocale('nom_du_plugin'));, à appeler AVANT frameheader() pour éviter les erreurs de variable manquante. Les traductions utilisent un tableau $dialnomplugin[]. $dialplugindisplay contient le titre affiché du plugin, $dialplugincall le nom dans le centre de contrôle. getAvailableLanguages() retourne la liste des langues disponibles.
Comment charger du CSS ou du JavaScript spécifique à un plugin ?+
Utilisez la variable globale $headdata pour injecter dans le <head> : $headdata .= '<link rel="stylesheet" type="text/css" href="plugins/mon_plugin/css/mon_plugin.css">'; Pour le JavaScript, même principe : $headdata .= '<script src="plugins/mon_plugin/js/mon_plugin.js"></script>'; Pour exécuter du JS après le DOM, utilisez $footdata avec un heredoc. Les CSS doivent utiliser les variables définies dans core.css — ne jamais inventer de couleurs. Si une variable manque, proposez de l'ajouter à core.css.
Comment valider les entrées utilisateur ?+
Utilisez le Sanitizer : use Beamreactor\Sanitizer\Parser; puis Parser::sanitize($input, 'type'). Les types disponibles incluent : bool, date, email, name, html, xml, uuid, url, string, ip, float, int, path et d'autres. sanitize() nettoie et valide la donnée, retournant false si invalide. check() vérifie le format sans nettoyer. Toujours sanitizer AVANT toute opération SQL. Ne jamais inventer de datatype — proposez-en un si nécessaire.
Comment interagir avec la base de données ?+
Utilisez la classe SQL : use Beamreactor\Database\SQL;. Méthodes principales : SQL::query() pour plusieurs lignes, SQL::queryFirst() pour une seule ligne, SQL::queryValue() pour une valeur unique, SQL::insertRow() pour insérer, SQL::updateRow() pour mettre à jour, SQL::deleteRow() pour supprimer. Toujours utiliser des requêtes préparées avec des paramètres ?. La concaténation directe de variables dans le SQL est strictement interdite. Vérifiez que la BDD est disponible avec isset($cfg['dbtable']) et que votre table existe avec SQL::tableExists().
Comment créer un endpoint AJAX ?+
Les modules (.mod.php) sont les endpoints AJAX de BeamReactor. Ils répondent en JSON, XML, HTML ou texte. Ils sont placés dans /handlers/nom_plugin.mod.php et appelés via ?obj=nom_plugin.mod (sans le .php). Ne jamais appeler le chemin complet du fichier. Structure minimale : vérification frameheader, sécurité avec secure(), header Content-Type, traitement de l'action via Parser::sanitize(), réponse JSON avec ['success' => !!1] ou ['success' => !!0]. Côté JavaScript, l'appel se fait avec $.post(BEAM_BASE_URL + '?obj=nom_plugin.mod', {...}).
Comment fonctionne le routage des pages ?+
Tout dans BeamReactor passe par index.php. Le paramètre ?obj= détermine ce qui est chargé. Un plugin : ?obj=mon_plugin.php. Un module AJAX : ?obj=mon_plugin.mod. Un document : ?obj=ma_page.dta. Le moteur XDP résout le chemin, charge la config, les libs et la locale automatiquement, puis exécute le script dans un environnement sécurisé. Aucun script PHP ne peut être appelé directement — tout passe par le moteur.
Comment afficher des notifications à l'utilisateur ?+
BeamReactor dispose d'un système de toasts avec 6 niveaux : debug (0), info (1), success (2), warning (3), error (4), critical (5). Usage rapide : Toast::info('Titre', 'Message', 5000); ou Toast::add(Toast::LEVEL_WARNING, 'Titre', 'Message', BASE_LEVEL_USER, 0). Le paramètre minUserLevel permet de cibler les notifications par niveau d'accès. La durée est en millisecondes, 0 pour persistant.
Quelle est la structure d'un plugin BeamReactor ?+
Un plugin est un dossier autonome dans /plugins/nom_du_plugin/ contenant : nom_du_plugin.php (interface principale), /conf/ (configuration auto-chargée), /lib/ (bibliothèques auto-chargées), /locale/ (traductions par langue), /handlers/ (endpoints AJAX .mod.php), /css/, /js/, /images/, /sql/ (installation des tables), /tests/, /doc/ (documentation .md et aide .help.json), et /data/cache/ pour les données persistantes. L'installation consiste à déposer le dossier. La suppression consiste à le retirer.
Comment afficher des dialogues JavaScript dans BeamReactor ?+
BeamReactor remplace les alert/confirm/prompt natifs par des dialogues personnalisés définis dans javascript/dialogs.js.php. Quatre fonctions : alertWindow('Titre', 'message') pour une alerte, confirmWindow('Titre', 'question ?', {}, callback) pour une confirmation, promptWindow('Titre', 'Label :', {}, callback) pour une saisie, infoWindow('Titre', 'info') pour une information. Ne jamais utiliser alert(), confirm() ou prompt() natifs.
Comment passer les traductions PHP au JavaScript ?+
Dans le fichier locale du plugin, définissez un tableau $js_translations et appelez setJavascriptLocale($js_translations). Exemple : $js_translations = ['mon_plugin' => ['error_msg' => $dialmonplugin[5]], 'global' => ['error' => $dial[32]]]; setJavascriptLocale($js_translations);. Côté JavaScript, accédez aux traductions via PLUGIN_TRANSLATION.mon_plugin.error_msg. Les traductions sont injectées dans le head comme un objet JavaScript global.
Puis-je utiliser exit ou die dans un plugin ?+
Non. Les plugins ne peuvent jamais utiliser exit ou die. Le seul exit autorisé dans tout le code d'un plugin est if(!function_exists('frameheader')) die('forbidden'); en première ligne, qui vérifie le contexte BeamReactor. Pour interrompre l'exécution, utilisez return. Pour gérer une erreur, affichez le message dans la frame puis faites return. Si un plugin utilise exit ou die, le moteur ne peut pas savoir ce qui a échoué et le diagnostic devient impossible.
Comment fonctionnent les niveaux de sécurité ?+
BeamReactor utilise une hiérarchie fixe : OVERMIND > ADMIN > MODERATOR > HIGHUSER > USER. Les constantes BASE_LEVEL_* sont définies dans cog.inc.php. Chaque plugin peut définir ses propres niveaux via NOM_PLUGIN_LEVEL_* dans sa configuration. $basedisplevel utilise toujours BASE_LEVEL_*, jamais PLUGIN_LEVEL_*. Les define() custom se font après $basedisplevel. Le système complète automatiquement les niveaux manquants via base_user_levels().
Comment fonctionne le chargement automatique des classes ?+
Les fichiers .lib.inc.php et .conf.inc.php sont chargés automatiquement par le moteur. Pour des classes supplémentaires, enregistrez un autoloader PSR-4 dans la configuration du plugin avec spl_autoload_register(). Le namespace suit la convention Beamreactor\NomPlugin\. Les fichiers de classe vont dans /lib/ et sont résolus par le chemin relatif au namespace. Cela permet à plusieurs plugins de cohabiter sans collision de noms.

Authentification à deux facteurs (2FA)

Elle ajoute une couche de protection indispensable en exigeant une preuve d'identité supplémentaire. Elle garantit que même en cas de vol de votre mot de passe, l'accès à vos données reste impossible pour un tiers. C'est le rempart le plus efficace contre les tentatives d'usurpation d'identité et de piratage de compte.

Comment activer l’authentification à deux facteurs ?+
Pour sécuriser votre compte, deux étapes sont nécessaires. Les utilisateurs enregistrés doivent se connecter à l'interface principale de BeamReactor. En cliquant sur le bouton "profil" en haut à gauche, vous accédez à votre profil. En bas se trouve un QRcode 2FA à scanner avec une application comme Google Authenticator ou Microsoft Authenticator. Des codes de secours seront disponibles : recopiez-les précieusement pour récupérer votre compte en cas de perte ou de vol de votre téléphone.
Comment me connecter avec l’authentification à deux facteurs ?+
Connectez-vous avec votre nom d'utilisateur et mot de passe sur le site BeamReactor. Le système vous demandera ensuite de rentrer un code que vous trouverez dans l'application Authenticator de votre téléphone.
Quelles sont les conditions à respecter ?+
Mettez à jour le système d’exploitation de votre téléphone et l’application Google ou Microsoft Authenticator vers leurs dernières versions. Si vous n’arrivez pas à vous connecter mais avez encore accès à l’email de votre compte, essayez de changer votre mot de passe. Sans accès à votre email, contactez-nous via le formulaire de support.
Et si j’ai oublié mon mot de passe ?+
Vous pouvez le réinitialiser à tout moment en cliquant sur le lien "compte inaccessible" sur la page de connexion.
Et si mon téléphone est perdu ou cassé ?+
Utilisez l'un de vos codes de secours fournis lors de l'enregistrement 2FA. Sur la page d'authentification, cliquez sur "code de secours", entrez-le, puis mettez à jour vos réglages 2FA dans votre profil une fois connecté.
Et si je change de téléphone ou de système ?+
Nouvel appareil, nouveau système, réinstallation après un formatage : la procédure est identique à celle d'un téléphone perdu. Utilisez vos codes de secours pour vous connecter, puis synchronisez votre nouvel appareil via votre profil utilisateur.
Pourquoi l’authentification à deux facteurs est-elle mise en place ?+
L'authentification à deux facteurs (2FA) ajoute une couche de protection indispensable en exigeant une preuve d'identité supplémentaire. Elle garantit que même en cas de vol de votre mot de passe, l'accès à vos données reste impossible pour un tiers. C'est le rempart le plus efficace contre les tentatives d'usurpation d'identité et de piratage de compte.

Besoin d'aide personnalisée ?

Ticketing — Pour les utilisateurs enregistrés. Créez un ticket, suivez son avancement, échangez avec le support technique. Votre historique est conservé.

Contact direct — Pour les demandes commerciales, les partenariats ou les questions avant achat. Pas besoin de compte.
Formulaire de contact →

Changelog récent

- 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)

Historique complet →

Pas trouvé votre réponse ?

Ouvrez un ticket ou contactez-nous.

de en es fr pt