. Aparece só a quem é // administrador — para os restantes, e para visitantes, não sai daqui uma // única linha de HTML. // // Não depende de nada: nem do Bootstrap (JS ou CSS), nem de ícones, nem de // jQuery. É um ficheiro incluído no fim de páginas que já são pesadas, e a // alternativa — assumir que o Bootstrap está carregado — partia-se no primeiro // site da frota que o não tivesse. O ícone é SVG inline pela mesma razão. // // O z-index (1035) é deliberadamente ABAIXO do backdrop dos modais do // Bootstrap (1050): com um modal aberto a bolha desaparece por baixo dele, em // vez de ficar a flutuar por cima de um diálogo que pediu a atenção toda. // // ─── Dois modos ────────────────────────────────────────────────────────────── // // $GLOBALS['platform_feedback_mode'] = 'footer'; // antes do include // // 'bubble' (por omissão) é a bolha a flutuar no canto — para o backoffice, onde // o canto está livre e quem trabalha quer o atalho sempre à vista. // // 'footer' é uma ligação dentro do rodapé, sem nada a flutuar — para o site // público, onde o canto inferior direito JÁ ESTÁ OCUPADO: o dance tem lá o // botão do WhatsApp (e uma barra fixa em telemóvel). Duas bolhas empilhadas no // mesmo canto são duas coisas a disputar o mesmo clique, e a que interessa ao // visitante é a outra. O painel continua a abrir fixo no canto, por cima de // tudo isso — está aberto por um instante e tem botão de fechar. // // Ver functions_feedback.php para o que é enviado, e api/feedback.php para // quem o recebe. // ───────────────────────────────────────────────────────────────────────────── require_once __DIR__ . '/functions_feedback.php'; require_once __DIR__ . '/functions_csrf.php'; (static function (): void { // Uma vez por resposta. O rodapé do backoffice e o do site público podem // acabar ambos incluídos na mesma página, e dois formulários com os mesmos // ids não é meio widget a mais: é um widget partido. if (!empty($GLOBALS['__platform_feedback_rendered'])) { return; } $user = platform_feedback_user(); if (!$user || !platform_feedback_is_admin($user)) { return; } $ligado = hub_ticket_ready(); // Sem emparelhamento não há para onde enviar. Ao administrador não se // mostra nada — não é ele que resolve isto, e um botão que falha é pior do // que botão nenhum. Ao sysadmin mostra-se, porque é ele que o liga: um // canal de relatos que desaparece em silêncio quando a chave roda perde // exactamente os relatos que mais interessavam. if (!$ligado && !platform_feedback_is_sysadmin($user)) { return; } $GLOBALS['__platform_feedback_rendered'] = true; $h = static fn(string $s): string => htmlspecialchars($s, ENT_QUOTES, 'UTF-8'); $cats = platform_feedback_categories(); // Caminho absoluto, e não base_url(): o site público da fotografia não // carrega o config/functions.php, e ali base_url() não existe (ver // ASSETS.md). O docroot é a raiz do domínio em toda a frota. $endpoint = '/api/feedback.php'; // A página onde o sysadmin liga isto. Cada site tem a sua árvore de vistas, // daí poder ser sobreposta pelo layout antes do include. // Num site com router (platform_connect(['router' => true])) é o endereço // dele; o stub antigo só reencaminha. $hubPage = (string) ($GLOBALS['platform_feedback_hub_url'] ?? (function_exists('platform_router_enabled') && platform_router_enabled() ? platform_route_url('hub_integration') : '/views/sysadmin/hub_integration.php')); $inline = ($GLOBALS['platform_feedback_mode'] ?? 'bubble') === 'footer'; ?>
Reportar à andmore
Alguma coisa errada na plataforma? Conta aqui.
Esta plataforma não está ligada ao balcão de apoio — nada seria enviado. Só tu vês esta bolha.
Liga-a em Integração com o hub: falta o endereço do hub, a chave de emparelhamento, ou ambos.