La modellazione del mio "componente" si è rotta. Come posso sistemarla?

In a Discourse instance che gestisco, ho un componente (ereditato dal precedente manutentore dell’istanza) per visualizzare i loghi degli sponsor di quell’istanza nel piè di pagina. Il componente funzionava bene fino a poco tempo fa, ma ora viene renderizzato in modo errato, visualizzando letteralmente le direttive di controllo del template (e inserendo letteralmente i segnaposto di valore del template nell’HTML, in modo che i percorsi delle immagini non vengano risolti):

Il componente non è mantenuto in un repository git, è configurato direttamente sotto “Admin” → “Appearance” → “Themes & components” → scheda “Components”:

Codice personalizzato

Sezioni personalizzate:

  • Comune: CSS, Footer, JS

Upload

File extra

Esporta tema per visualizzare questi file.
  • javascripts/discourse/api-initializers/theme-initializer.gjs

contenuto di queste “sezioni”

come si vede cliccando su “Edit Code”; percorso dei file corrispondenti nell’esportazione tra parentesi

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) => {
  // Questo è l'outlet del plugin, seguito da un nome personalizzato per il componente
  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); 
        }
      });
    }
    
  });
});

L’esportazione contiene inoltre:
about.json (466 Bytes)
che presumo venga generato al volo durante l’esportazione, quindi non ritengo sia rilevante.

La parte rilevante del DOM effettivo con questo errore è:

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

quindi possiamo vedere che la direttiva di controllo {{#if ...}}...{{/if}} e i segnaposto {{theme-setting "..."}} sono stati usati come HTML letterale anziché eseguiti / valutati / interpolati.

Come e perché è cambiato e come dovrei correggerlo?

Forse è correlato a Upcoming Header Changes - Preparing Themes and Plugins? (Anche se non vedo menzionate modifiche alla sintassi dei template lì.)

1 Mi Piace

(Con “come e perché” intendo: Qual è stata la modifica sottostante e mi sono perso qualche notifica a riguardo? Sono sufficientemente sicuro che qualunque cosa abbia causato questo cambiamento di comportamento sia arrivata in quell’istanza tramite gli aggiornamenti automatici di Discourse attivati, ma vorrei conoscere la causa principale.)

C’è qualche errore o avviso nella console per fornire ulteriori informazioni?

1 Mi Piace

Nella console del browser? Forse — non sono sicuro di cosa sia “normale” lì e cosa potrebbe indicare il problema. Posso semplicemente incollare il suo contenuto qui o potrebbe trapelare informazioni sensibili?

Sì, la console del browser: puoi tranquillamente incollarla :slight_smile: Spesso, se qualcosa è deprecato, la console restituirà informazioni utili.

1 Mi Piace
Contenuto completo della console del browser dal caricamento di 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] Per prevenire errori nei test, aggiungi una chiave `pluginId` alla tua chiamata `modifyClass`. Questo assicurerà che la modifica venga applicata una sola volta. chunk.f47b6dc1cc59c827db42.d41d8cd9.js:209:136918
DEPRECATION NOTICE: Definire classi di connettori tramite registerConnectorClass è deprecato. Vedi https://meta.discourse.org/t/32727 per pattern più moderni. [deprecation id: discourse.register-connector-class-legacy] chunk.f47b6dc1cc59c827db42.d41d8cd9.js:134:74065
Errore nell'analisi del valore per ‘-webkit-text-size-adjust’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:800
Errore nell'analisi del valore per ‘-moz-text-size-adjust’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:827
Proprietà sconosciuta ‘text-size-adjust’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:849
Pseudo-classe o pseudo-elemento sconosciuto ‘-moz-focus-inner’. Regola ignorata a causa di un selettore errato. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:1615
Previsto ‘none’, URL, o funzione filtro ma trovato ‘alpha(’. Errore nell'analisi del valore per ‘filter’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:622
Regola ignorata a causa di un selettore errato. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:36117
Errore nell'analisi del valore per ‘justify-content’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:181379
Errore nell'analisi del valore per ‘text-wrap’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:205516
Errore nell'analisi del valore per ‘image-rendering’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:264428
Errore nell'analisi del valore per ‘-webkit-text-size-adjust’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268491
Errore nell'analisi del valore per ‘-moz-text-size-adjust’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268518
Proprietà sconosciuta ‘text-size-adjust’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268540
Errore nell'analisi del valore per ‘font-size’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:298136
Previsto ‘none’, URL, o funzione filtro ma trovato ‘alpha(’. Errore nell'analisi del valore per ‘filter’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:447258
Previsto ‘none’, URL, o funzione filtro ma trovato ‘alpha(’. Errore nell'analisi del valore per ‘filter’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:447681
Previsto ‘none’, URL, o funzione filtro ma trovato ‘alpha(’. Errore nell'analisi del valore per ‘filter’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:33799
Errore nell'analisi del valore per ‘text-wrap’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:105390
Errore nell'analisi del valore per ‘text-wrap’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:105471
Errore nell'analisi del valore per ‘padding’. Dichiarazione ignorata. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:257744

Suppongo di dover guardare Using Plugin Outlet Connectors from a Theme or Plugin

Quindi, penso che registerConnectorClass con setupComponent sia deprecato, guarda il tuo registro degli errori:

DEPRECATION NOTICE: Defining connector classes via registerConnectorClass is deprecated. See https://meta.discourse.org/t/32727 for more modern patterns. [deprecation id: discourse.register-connector-class-legacy] chunk.f47b6dc1cc59c827db42.d41d8cd9.js:134:74065

e non sono nemmeno sicuro che tolleriamo ancora l’html grezzo, come nel tuo componente del piè di pagina.

Quindi questo componente dovrà essere ristrutturato secondo i modelli moderni, e consiglierei di spostarlo anche in un componente appropriato, invece di dove risiede attualmente sotto Admin.

Per rispondere alla tua altra domanda

È dovuto al lavoro in corso di modernizzazione di Discourse e al passaggio a nuovi standard moderni con i componenti Glimmer.

3 Mi Piace

Se non HTML grezzo (-template), qual è il contenuto previsto per https://www.geowebforum.ch/admin/customize/themes/3/common/footer/edit? Markdown, come nei contenuti forniti dagli utenti?

Puoi indicarmi qualche guida su come farlo? Mi sento un po’ perso con la documentazione di Discourse apparentemente sparsa in tutto il meta forum.

Per quello, posso semplicemente decomprimere l’“export” e caricarlo in un repository Git?

Il mio componente non è già un componente Glimmer se ha un file *.gjs nell’export? O questo è in realtà parte del problema: l’attuale Discourse scambia il mio componente per un componente Glimmer (e quindi lo esporta con quel nome di file) anche se a livello di codice non lo è ancora?

(Perdonate la mia ignoranza. Non sono uno sviluppatore web e so quasi nulla di Ember e Glimmer.)

1 Mi Piace

Intendevo dire: l’HTML grezzo non viene più analizzato correttamente con l’ultima versione, quindi stai semplicemente vedendo l’HTML scaricato invece di essere renderizzato.

Sì, il file .gjs indicava effettivamente un componente glimmer, ma il metodo utilizzato di registerConnectorClass in esso non funzionerà (più).

Questo è del tutto comprensibile. Quello che Using Plugin Outlet Connectors from a Theme or Plugin sta essenzialmente dicendo è che, per visualizzare informazioni da qualche parte sulla pagina tramite quel metodo registerConnectorClass, come faceva il tuo file footer.html, ora usiamo un elemento specifico, chiamato “plugin outlet”. Per un piè di pagina, l’outlet above-footer funzionerebbe bene.

Probabilmente è una buona idea leggere attraverso Beginner's guide to using Discourse Themes e Developing Discourse Themes & Theme Components

Può anche aiutare dare un’occhiata a un semplice componente tema, per capire la struttura. Ad esempio: GitHub - discourse/discourse-minimal-footer · GitHub

E infine, il bot di Discourse potrebbe essere in grado di aiutarti per tutto il percorso: conosce bene i pattern di Discourse, quindi puoi fornirgli il tuo codice attuale, spiegare il problema e chiedergli di aiutarti a rifattorizzarlo.

2 Mi Piace

Ti riferisci a @discobot?

No, è ask.discourse.com.

2 Mi Piace