A template do meu "componente" quebrou. Como eu conserto?

Em uma instância do Discourse que mantenho, tenho um componente (herdado do mantenedor anterior da instância) para exibir os logotipos dos patrocinadores dessa instância no rodapé. O componente costumava funcionar bem até recentemente, mas agora está sendo renderizado incorretamente, exibindo as diretivas de controle do template literalmente (e colocando os placeholders de valor do template literalmente no HTML, de modo que os caminhos para as imagens não são resolvidos):

O componente não é mantido em um repositório git, ele é configurado diretamente em “Admin” → “Appearance” → “Themes & components” → aba “Components”:

Custom Code

Custom sections:

  • Common: CSS, Footer, JS

Uploads

Extra files

Export theme to view these files.
  • javascripts/discourse/api-initializers/theme-initializer.gjs

conteúdo dessas “seções”

conforme visto ao clicar em “Edit Code”; caminho para os arquivos correspondentes na exportação fornecido entre parênteses

CSS (common/common.scss)
.sponsors {
    .inner {
        display: flex;
        align-items: center;
        justify-content: space-around;
        margin-bottom: 10px;
    }

    .heading {
        font-size: 1.75em;
    }

    .sponsor-image {
        max-height: 55px;
    }

    .geoaargau {
        max-height: 45px;
    }
}
Footer (common/footer.html)
  {{#if displaySponsors}}
    <div class="sponsors-wrapper wrap">
      <div class="inner">
        <h3 class="heading">Sponsoren</h3>
        <a href="http://www.asseco-berit.ch/"><img src="{{theme-setting "theme_uploads.asseco_berit"}}" alt="Asseco Berit" class="sponsor-image asseco-berit"></a>
        <a href="http://www.geoaargau.ch/"><img src="{{theme-setting "theme_uploads.geoaargau"}}" alt="GEOAargau" class="sponsor-image geoaargau"></a>
      </div>
    </div>
  {{/if}}
JS (javascripts/discourse/api-initializers/theme-initializer.gjs)
import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  // This is the plugin outlet, followed by a custom name for the component
  api.registerConnectorClass("above-footer", "sponsors", {

    setupComponent(args, component) {
        
     var topMenuRoutes = 
        component.siteSettings.top_menu.split('|')
        .map(function(route) {return '/' + route});
      
     var homeRoute = topMenuRoutes[0];
     
     api.onPageChange((url) => {

        if (url === "/" || url === homeRoute ){ 
          document.querySelector("html").classList.add("sponsors"); 
          component.set("displaySponsors", true); 
        } else {
          document.querySelector("html").classList.remove("sponsors"); 
          component.set("displaySponsors", false); 
        }
      });
    }
    
  });
});

A exportação contém adicionalmente:
about.json (466 Bytes)
que eu suponho ser gerado dinamicamente quando se exporta, então não acho que seja relevante.

A parte relevante do DOM efetivo com essa quebra é:

<div class="custom-footer-content">
    {{#if displaySponsors}}
    <div class="sponsors-wrapper wrap">
      <div class="inner">
        <h3 class="heading">Sponsoren</h3>
        <a href="http://www.asseco-berit.ch/"><img src="{{theme-setting " theme_uploads.asseco_berit"}}" alt="Asseco Berit" class="sponsor-image asseco-berit"></a>
        <a href="http://www.geoaargau.ch/"><img src="{{theme-setting " theme_uploads.geoaargau"}}" alt="GEOAargau" class="sponsor-image geoaargau"></a>
      </div>
    </div>
  {{/if}}
</div>

para que possamos ver que a diretiva de controle {{#if ...}}...{{/if}} e os placeholders {{theme-setting "..."}} foram usados como HTML literal em vez de executados/avaliados/interpolados.

Como e por que isso mudou e como devo consertar?

Pode estar relacionado com Upcoming Header Changes - Preparing Themes and Plugins? (Embora eu não veja alterações na sintaxe de template mencionadas lá.)

1 curtida

(Por “como e por que” eu quero dizer: Qual foi a mudança subjacente e eu perdi alguma notificação sobre isso? Estou suficientemente certo de que o que causou essa mudança de comportamento chegou nessa instância pelas atualizações automáticas ativadas do Discourse, mas eu gostaria de saber qual é a causa raiz.)

Existe algum erro ou aviso no console para fornecer mais informações?

1 curtida

No console do navegador? Talvez — não tenho certeza do que é “normal” ali e o que poderia estar indicando o problema. Posso apenas colar o conteúdo aqui ou isso poderia vazar informações sensíveis?

Sim, o console do navegador – pode colar lá :slight_smile: Muitas vezes, se algo estiver obsoleto, o console emitirá algumas informações úteis.

1 curtida
Conteúdo completo do console do navegador ao carregar https://www.geowebforum.ch/c/feedback/2
ℹ️ Discourse v2026.3.0-latest — https://github.com/discourse/discourse/commits/38ad2acd2c — Ember v6.6.0 chunk.f47b6dc1cc59c827db42.d41d8cd9.js:275:35231
[PLUGIN discourse-weekly-newsletter] Para evitar erros em testes, adicione uma chave `pluginId` à sua chamada `modifyClass`. Isso garantirá que a modificação seja aplicada apenas uma vez. chunk.f47b6dc1cc59c827db42.d41d8cd9.js:209:136918
DEPRECATION NOTICE: Definir classes de conector via registerConnectorClass está obsoleto. Veja https://meta.discourse.org/t/32727 para padrões mais modernos. [deprecation id: discourse.register-connector-class-legacy] chunk.f47b6dc1cc59c827db42.d41d8cd9.js:134:74065
Erro ao analisar o valor para ‘-webkit-text-size-adjust’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:800
Erro ao analisar o valor para ‘-moz-text-size-adjust’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:827
Propriedade desconhecida ‘text-size-adjust’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:849
Pseudo-classe ou pseudo-elemento desconhecido ‘-moz-focus-inner’. Ruleset ignorado devido a seletor inválido. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:1615
Esperado ‘none’, URL ou função de filtro, mas encontrou ‘alpha(’. Erro ao analisar o valor para ‘filter’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:622
Ruleset ignorado devido a seletor inválido. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:36117
Erro ao analisar o valor para ‘justify-content’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:181379
Erro ao analisar o valor para ‘text-wrap’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:205516
Erro ao analisar o valor para ‘image-rendering’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:264428
Erro ao analisar o valor para ‘-webkit-text-size-adjust’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268491
Erro ao analisar o valor para ‘-moz-text-size-adjust’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268518
Propriedade desconhecida ‘text-size-adjust’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268540
Erro ao analisar o valor para ‘font-size’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:298136
Esperado ‘none’, URL ou função de filtro, mas encontrou ‘alpha(’. Erro ao analisar o valor para ‘filter’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:447258
Esperado ‘none’, URL ou função de filtro, mas encontrou ‘alpha(’. Erro ao analisar o valor para ‘filter’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:447681
Esperado ‘none’, URL ou função de filtro, mas encontrou ‘alpha(’. Erro ao analisar o valor para ‘filter’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:33799
Erro ao analisar o valor para ‘text-wrap’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:105390
Erro ao analisar o valor para ‘text-wrap’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:105471
Erro ao analisar o valor para ‘padding’. Declaração descartada. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:257744

Acho que preciso olhar em Using Plugin Outlet Connectors from a Theme or Plugin

Então, eu acho que registerConnectorClass com setupComponent está obsoleto, veja seu log de erro:

AVISO DE OBSOLESCÊNCIA: Definir classes de conector via registerConnectorClass está obsoleto. Veja https://meta.discourse.org/t/32727 para padrões mais modernos. [id de obsolescência: discourse.register-connector-class-legacy] chunk.f47b6dc1cc59c827db42.d41d8cd9.js:134:74065

e eu também não tenho certeza se ainda toleramos HTML puro, como no seu componente de rodapé.

Portanto, este componente terá que ser reestruturado para padrões modernos, e eu aconselharia movê-lo para um componente adequado também, em vez de onde ele reside atualmente, em Admin.

Para responder à sua outra pergunta

É devido ao trabalho contínuo de modernização do Discourse e à migração para novos padrões modernos com componentes Glimmer.

3 curtidas

[quote=“chapoi, post:7, topic:398553”]
e eu também não tenho certeza se ainda toleramos HTML puro, como no seu componente de rodapé.
[/quote]Se não for HTML puro (-template), qual é o conteúdo esperado de https://www.geowebforum.ch/admin/customize/themes/3/common/footer/edit? Markdown, como no conteúdo fornecido pelo usuário?

[quote=“chapoi, post:7, topic:398553”]
Então, este componente terá que ser reestruturado para padrões modernos,
[/quote]Você pode apontar alguma orientação sobre como fazer isso? Estou me sentindo um pouco perdido com a documentação do Discourse aparentemente espalhada por todo o fórum meta.

[quote=“chapoi, post:7, topic:398553”]
e eu aconselharia movê-lo para um componente adequado também, em vez de onde reside atualmente em Admin.
[/quote]Para isso, posso simplesmente descompactar a “exportação” e enviá-la para um repositório Git?

[quote=“chapoi, post:7, topic:398553”]

É devido ao trabalho em andamento de modernização do Discourse e à migração para novos padrões modernos com componentes Glimmer.
[/quote]Meu componente já não é um componente Glimmer se ele tiver um arquivo *.gjs na exportação? Ou isso é, na verdade, parte do problema – o Discourse atual confundindo meu componente com um componente Glimmer (e, portanto, exportando-o com esse nome de arquivo) embora em termos de código ainda não seja um?

(Por favor, desculpe minha ignorância. Eu não sou um desenvolvedor web e não sei quase nada sobre Ember e Glimmer.)

1 curtida

Eu quis dizer: O HTML bruto não está mais sendo analisado corretamente com a versão mais recente, por isso você está apenas vendo o HTML despejado em vez de renderizado.

Sim, o arquivo .gjs de fato indicava um componente glimmer, mas o método usado de registerConnectorClass nele não funcionará (mais).

Isso é totalmente compreensível. O que Using Plugin Outlet Connectors from a Theme or Plugin essencialmente está dizendo é que, para renderizar informações em algum lugar da página através daquele método registerConnectorClass, da forma como seu arquivo footer.html fazia, agora usamos um elemento específico, chamado plugin outlet. Para um rodapé, o outlet above-footer funcionaria bem.

Provavelmente é uma boa ideia ler Beginner's guide to using Discourse Themes e Developing Discourse Themes & Theme Components

Também pode ajudar dar uma olhada em um componente de tema simples, para entender a estrutura. Por exemplo: GitHub - discourse/discourse-minimal-footer · GitHub

E, finalmente, o bot do Discourse pode ser capaz de ajudar você até o fim do caminho: ele conhece bem os padrões do Discourse, então você pode dar a ele seu código atual, explicar o problema e pedir para ele ajudar você a refatorá-lo.

2 curtidas