En vous promenant sur Beamreactor, nous stockons votre IP 48h pour des raisons de sécurité.
Beamreactor, WYSIWYG web engines: home
FAQ · TICKETS · CONTACTO · CHANGELOG

Um problema?
Estamos aqui.

Consulte a FAQ, abra um ticket de suporte ou contacte-nos diretamente. Sem chatbot, sem fila de espera: um operador responde-lhe.

Antes de escrever, a resposta talvez esteja aqui

Funções e arquitetura

Perguntas técnicas sobre o motor XDP, os plugins, a segurança, o sistema de frames e as convenções de desenvolvimento do BeamReactor.

Para que serve frameheader()?+
frameheader() abre uma secção visual (frame) na página. Apresenta o título do plugin ou da secção e cria o contentor HTML no qual o conteúdo será renderizado. Utilização: frameheader('O meu título', 'h3', false). Os níveis de título seguem a hierarquia HTML: h1 para o título da página (uma única vez), h2 para as secções principais, h3 e seguintes para as frames e widgets. Um plugin chamado diretamente deve começar por: if($obj=='o_meu_plugin.php') frameheader($dialplugindisplay); — esta condição evita a apresentação dupla do cabeçalho quando o plugin é incluído a partir de outro script.
Quando usar framefooter()?+
framefooter() fecha a frame aberta por frameheader(). É indispensável antes de abrir uma nova secção com frameheader(). Nunca chame framefooter() sem um frameheader() a seguir, exceto no fim da página. O padrão clássico para estruturar uma página em vários blocos: frameheader('Secção 1'); /* conteúdo */ framefooter(); frameheader('Secção 2'); /* conteúdo */. O motor trata automaticamente do fecho final.
Como estruturar uma página em várias secções?+
Use o par framefooter() / frameheader() para encadear as secções. Cada secção cria um bloco visual distinto com o seu próprio título. Exemplo: depois de apresentar um formulário e receber um erro, feche a frame atual com framefooter(), abra uma nova frame limpa com frameheader(''), inclua novamente o formulário e faça return. Assim, o utilizador permanece numa página válida e enquadrada, sem redirecionamento HTTP.
Como funciona secure()?+
secure() verifica se o nível do utilizador com sessão iniciada é suficiente para aceder a um recurso. Recebe como parâmetro uma constante de nível (BASE_LEVEL_ADMIN, PLUGIN_LEVEL_MODERATOR, etc.) e devolve true ou false. O padrão normal: frameheader($dialplugindisplay); if(!secure(PLUGIN_LEVEL_MODERATOR)) { forbids(); return; }. A frame é aberta ANTES da verificação — forbids() é apresentado dentro da frame, caso contrário o layout fica partido. O truque secure(0) verifica simplesmente se o utilizador tem sessão iniciada.
Que includes usar num plugin?+
Nenhum para a configuração e as bibliotecas — o motor XDP carrega-as automaticamente. O único include autorizado é o da locale: include(getlocale('nome_do_plugin'));. Os ficheiros .conf.inc.php e .lib.inc.php são detetados e carregados pelo motor. Fazer um require ou include manual da configuração ou das libs provoca um warning e um caminho partido. Do mesmo modo, nunca inclua um módulo (.mod.php) — são chamados exclusivamente através de ?obj=nome.mod.
Como funcionam as traduções num plugin?+
Cada plugin tem os seus ficheiros de tradução em /locale/nome_do_plugin.XX.inc.php (XX = código de língua ISO). O carregamento é feito através de include(getlocale('nome_do_plugin'));, a chamar ANTES de frameheader() para evitar erros de variável em falta. As traduções usam um array $dialnomeplugin[]. $dialplugindisplay contém o título apresentado do plugin, $dialplugincall o nome no centro de controlo. getAvailableLanguages() devolve a lista das línguas disponíveis.
Como carregar CSS ou JavaScript específico de um plugin?+
Use a variável global $headdata para injetar no <head>: $headdata .= '<link rel="stylesheet" type="text/css" href="plugins/o_meu_plugin/css/o_meu_plugin.css">'; Para o JavaScript, o princípio é o mesmo: $headdata .= '<script src="plugins/o_meu_plugin/js/o_meu_plugin.js"></script>'; Para executar JS depois do DOM, use $footdata com um heredoc. As CSS devem usar as variáveis definidas em core.css — nunca invente cores. Se faltar uma variável, proponha acrescentá-la a core.css.
Como validar as entradas do utilizador?+
Use o Sanitizer: use Beamreactor\Sanitizer\Parser; e depois Parser::sanitize($input, 'type'). Os tipos disponíveis incluem: bool, date, email, name, html, xml, uuid, url, string, ip, float, int, path e outros. sanitize() limpa e valida o dado, devolvendo false se for inválido. check() verifica o formato sem limpar. Faça sempre a sanitização ANTES de qualquer operação SQL. Nunca invente um datatype — proponha um se necessário.
Como interagir com a base de dados?+
Use a classe SQL: use Beamreactor\Database\SQL;. Métodos principais: SQL::query() para várias linhas, SQL::queryFirst() para uma só linha, SQL::queryValue() para um valor único, SQL::insertRow() para inserir, SQL::updateRow() para atualizar, SQL::deleteRow() para eliminar. Use sempre consultas preparadas com parâmetros ?. A concatenação direta de variáveis no SQL é estritamente proibida. Verifique que a BD está disponível com isset($cfg['dbtable']) e que a sua tabela existe com SQL::tableExists().
Como criar um endpoint AJAX?+
Os módulos (.mod.php) são os endpoints AJAX do BeamReactor. Respondem em JSON, XML, HTML ou texto. Ficam em /handlers/nome_plugin.mod.php e são chamados através de ?obj=nome_plugin.mod (sem o .php). Nunca chame o caminho completo do ficheiro. Estrutura mínima: verificação de frameheader, segurança com secure(), header Content-Type, tratamento da ação através de Parser::sanitize(), resposta JSON com ['success' => !!1] ou ['success' => !!0]. Do lado do JavaScript, a chamada faz-se com $.post(BEAM_BASE_URL + '?obj=nome_plugin.mod', {...}).
Como funciona o encaminhamento das páginas?+
Tudo no BeamReactor passa pelo index.php. O parâmetro ?obj= determina o que é carregado. Um plugin: ?obj=o_meu_plugin.php. Um módulo AJAX: ?obj=o_meu_plugin.mod. Um documento: ?obj=a_minha_pagina.dta. O motor XDP resolve o caminho, carrega automaticamente a configuração, as libs e a locale, e executa o script num ambiente seguro. Nenhum script PHP pode ser chamado diretamente — tudo passa pelo motor.
Como apresentar notificações ao utilizador?+
O BeamReactor dispõe de um sistema de toasts com 6 níveis: debug (0), info (1), success (2), warning (3), error (4), critical (5). Utilização rápida: Toast::info('Título', 'Mensagem', 5000); ou Toast::add(Toast::LEVEL_WARNING, 'Título', 'Mensagem', BASE_LEVEL_USER, 0). O parâmetro minUserLevel permite direcionar as notificações por nível de acesso. A duração é em milissegundos, 0 para persistente.
Qual é a estrutura de um plugin BeamReactor?+
Um plugin é uma pasta autónoma em /plugins/nome_do_plugin/ que contém: nome_do_plugin.php (interface principal), /conf/ (configuração carregada automaticamente), /lib/ (bibliotecas carregadas automaticamente), /locale/ (traduções por língua), /handlers/ (endpoints AJAX .mod.php), /css/, /js/, /images/, /sql/ (instalação das tabelas), /tests/, /doc/ (documentação .md e ajuda .help.json) e /data/cache/ para os dados persistentes. A instalação consiste em colocar a pasta. A remoção consiste em retirá-la.
Como apresentar diálogos JavaScript no BeamReactor?+
O BeamReactor substitui os alert/confirm/prompt nativos por diálogos personalizados definidos em javascript/dialogs.js.php. Quatro funções: alertWindow('Título', 'mensagem') para um alerta, confirmWindow('Título', 'pergunta?', {}, callback) para uma confirmação, promptWindow('Título', 'Etiqueta:', {}, callback) para uma introdução de dados, infoWindow('Título', 'info') para uma informação. Nunca use alert(), confirm() ou prompt() nativos.
Como passar as traduções PHP para o JavaScript?+
No ficheiro de locale do plugin, defina um array $js_translations e chame setJavascriptLocale($js_translations). Exemplo: $js_translations = ['o_meu_plugin' => ['error_msg' => $dialomeuplugin[5]], 'global' => ['error' => $dial[32]]]; setJavascriptLocale($js_translations);. Do lado do JavaScript, aceda às traduções através de PLUGIN_TRANSLATION.o_meu_plugin.error_msg. As traduções são injetadas no head como um objeto JavaScript global.
Posso usar exit ou die num plugin?+
Não. Os plugins nunca podem usar exit ou die. O único exit autorizado em todo o código de um plugin é if(!function_exists('frameheader')) die('forbidden'); na primeira linha, que verifica o contexto BeamReactor. Para interromper a execução, use return. Para tratar um erro, apresente a mensagem dentro da frame e faça return. Se um plugin usar exit ou die, o motor não consegue saber o que falhou e o diagnóstico torna-se impossível.
Como funcionam os níveis de segurança?+
O BeamReactor usa uma hierarquia fixa: OVERMIND > ADMIN > MODERATOR > HIGHUSER > USER. As constantes BASE_LEVEL_* são definidas em cog.inc.php. Cada plugin pode definir os seus próprios níveis através de NOME_PLUGIN_LEVEL_* na sua configuração. $basedisplevel usa sempre BASE_LEVEL_*, nunca PLUGIN_LEVEL_*. Os define() personalizados fazem-se depois de $basedisplevel. O sistema completa automaticamente os níveis em falta através de base_user_levels().
Como funciona o carregamento automático das classes?+
Os ficheiros .lib.inc.php e .conf.inc.php são carregados automaticamente pelo motor. Para classes adicionais, registe um autoloader PSR-4 na configuração do plugin com spl_autoload_register(). O namespace segue a convenção Beamreactor\NomePlugin\. Os ficheiros de classe ficam em /lib/ e são resolvidos pelo caminho relativo ao namespace. Isto permite que vários plugins coexistam sem colisão de nomes.

Autenticação de dois fatores (2FA)

Acrescenta uma camada de proteção indispensável, exigindo uma prova de identidade adicional. Garante que, mesmo que a sua palavra-passe seja roubada, um terceiro não consegue aceder aos seus dados. É a barreira mais eficaz contra tentativas de usurpação de identidade e de pirataria de contas.

Como ativar a autenticação de dois fatores?+
Para proteger a sua conta, são necessários dois passos. Os utilizadores registados devem iniciar sessão na interface principal do BeamReactor. Clicando no botão «Perfil», no canto superior esquerdo, acede ao seu perfil. Na parte inferior encontra um código QR 2FA para ler com uma aplicação como o Google Authenticator ou o Microsoft Authenticator. Serão disponibilizados códigos de recuperação: copie-os com cuidado para recuperar a sua conta em caso de perda ou roubo do telemóvel.
Como inicio sessão com a autenticação de dois fatores?+
Inicie sessão com o seu nome de utilizador e palavra-passe no site BeamReactor. O sistema pedir-lhe-á depois um código, que encontra na aplicação Authenticator do seu telemóvel.
Quais são os requisitos?+
Atualize o sistema operativo do seu telemóvel e a aplicação Google ou Microsoft Authenticator para as versões mais recentes. Se não conseguir iniciar sessão mas ainda tiver acesso ao e-mail da sua conta, experimente alterar a palavra-passe. Sem acesso ao e-mail, contacte-nos através do formulário de suporte.
E se me esqueci da palavra-passe?+
Pode redefini-la a qualquer momento clicando na ligação «Não consegue aceder à conta?» na página de início de sessão.
E se o meu telemóvel se perdeu ou avariou?+
Utilize um dos códigos de recuperação fornecidos no registo da 2FA. Na página de autenticação, clique em «Código de recuperação», introduza-o e, depois de iniciar sessão, atualize as definições 2FA no seu perfil.
E se mudar de telemóvel ou de sistema?+
Novo aparelho, novo sistema, reinstalação após uma formatação: o procedimento é idêntico ao de um telemóvel perdido. Utilize os seus códigos de recuperação para iniciar sessão e depois sincronize o novo aparelho através do seu perfil de utilizador.
Porque é que a autenticação de dois fatores foi implementada?+
A autenticação de dois fatores (2FA) acrescenta uma camada de proteção indispensável, exigindo uma prova de identidade adicional. Garante que, mesmo que a sua palavra-passe seja roubada, um terceiro não consegue aceder aos seus dados. É a barreira mais eficaz contra tentativas de usurpação de identidade e de pirataria de contas.

Precisa de ajuda personalizada?

Tickets — Para os utilizadores registados. Crie um ticket, acompanhe o seu andamento, troque mensagens com o suporte técnico. O seu historial é conservado.

Contacto direto — Para pedidos comerciais, parcerias ou perguntas antes da compra. Não é necessária conta.
Formulário de contacto →

Changelog recente

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

Historial completo →

Não encontrou a sua resposta?

Abra um ticket ou contacte-nos.

de en es fr pt