Templating meiner "component" ist kaputt. Wie behebe ich das?

In einer Discourse-Instanz, die ich betreue, habe ich eine Komponente (von meinem Vorgänger übernommen), um die Logos der Sponsoren dieser Instanz in der Fußzeile anzuzeigen. Die Komponente funktionierte bis vor kurzem einwandfrei, wird aber jetzt falsch dargestellt, da sie die Template-Steuerungsdirektiven wörtlich anzeigt (und die Platzhalter für die Template-Werte wörtlich in den HTML-Code einfügt, sodass die Pfade zu den Bildern nicht aufgelöst werden):

Die Komponente wird nicht in einem Git-Repository gepflegt, sondern direkt unter „Admin“ → „Appearance“ → „Themes & components“ → Reiter „Components“ konfiguriert:

Custom Code

Custom sections:

  • Common: CSS, Footer, JS

Uploads

Extra files

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

Inhalt dieser „Abschnitte“

wie beim Klicken auf „Code bearbeiten“ zu sehen; Pfad zu den entsprechenden Dateien im Export in Klammern angegeben

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

Der Export enthält zusätzlich:
about.json (466 Bytes)
was ich vermute, bei jedem Export on-the-fly generiert wird, daher nehme ich an, dass es nicht relevant ist.

Der relevante Teil des effektiven DOMs mit dieser Beschädigung ist:

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

sodass man sehen kann, dass die Steuerungsdirektive {{#if ...}}...{{/if}} und die Platzhalter {{theme-setting "..."}} als literales HTML verwendet wurden, anstatt ausgeführt/ausgewertet/interpoliert zu werden.

Wie und warum hat sich das geändert und wie sollte ich das beheben?

Hängt das möglicherweise mit Upcoming Header Changes - Preparing Themes and Plugins zusammen? (Obwohl dort keine Änderungen an der Template-Syntax erwähnt werden.)

1 „Gefällt mir“

(Mit „wie und warum“ meine ich: Was war die zugrunde liegende Änderung, und habe ich irgendwelche Benachrichtigungen darüber verpasst? Ich bin mir ziemlich sicher, dass das, was diese Verhaltensänderung verursacht hat, durch die aktivierten automatischen Discourse-Updates in dieser Instanz gelandet ist, aber ich möchte die eigentliche Ursache wissen.)

Gibt es einen Fehler oder eine Warnung in der Konsole, um weitere Informationen zu liefern?

1 „Gefällt mir“

In der Browserkonsole? Vielleicht — Ich bin mir nicht sicher, was dort „normal“ ist und was auf das Problem hindeuten könnte. Kann ich einfach den Inhalt hier einfügen oder könnten dadurch sensible Informationen preisgegeben werden?

Ja, die Browserkonsole – es ist in Ordnung, es einzufügen :slight_smile: Oft gibt die Konsole nützliche Informationen aus, wenn etwas veraltet ist.

1 „Gefällt mir“
Vollständiger Inhalt der Browserkonsole beim Laden von 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] To prevent errors in tests, add a `pluginId` key to your `modifyClass` call. This will ensure the modification is only applied once. chunk.f47b6dc1cc59c827db42.d41d8cd9.js:209:136918
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
Error in parsing value for ‘-webkit-text-size-adjust’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:800
Error in parsing value for ‘-moz-text-size-adjust’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:827
Unknown property ‘text-size-adjust’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:849
Unknown pseudo-class or pseudo-element ‘-moz-focus-inner’.  Ruleset ignored due to bad selector. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:1615
Expected ‘none’, URL, or filter function but found ‘alpha(’.  Error in parsing value for ‘filter’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:622
Ruleset ignored due to bad selector. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:36117
Error in parsing value for ‘justify-content’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:181379
Error in parsing value for ‘text-wrap’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:205516
Error in parsing value for ‘image-rendering’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:264428
Error in parsing value for ‘-webkit-text-size-adjust’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268491
Error in parsing value for ‘-moz-text-size-adjust’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268518
Unknown property ‘text-size-adjust’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268540
Error in parsing value for ‘font-size’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:298136
Expected ‘none’, URL, or filter function but found ‘alpha(’.  Error in parsing value for ‘filter’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:447258
Expected ‘none’, URL, or filter function but found ‘alpha(’.  Error in parsing value for ‘filter’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:447681
Expected ‘none’, URL, or filter function but found ‘alpha(’.  Error in parsing value for ‘filter’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:33799
Error in parsing value for ‘text-wrap’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:105390
Error in parsing value for ‘text-wrap’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:105471
Error in parsing value for ‘padding’.  Declaration dropped. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:257744

Ich schätze, ich muss mir Using Plugin Outlet Connectors from a Theme or Plugin ansehen.

Ich denke, registerConnectorClass mit setupComponent ist veraltet, siehe Ihre Fehlerprotokoll:

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

und ich bin mir auch nicht sicher, ob wir den reinen HTML-Code, wie in Ihrer Footer-Komponente, noch tolerieren.

Diese Komponente muss also nach modernen Mustern refaktorisiert werden, und ich würde empfehlen, sie stattdessen an eine geeignete Stelle zu verschieben, anstatt sie dort zu belassen, wo sie sich derzeit unter Admin befindet.

Um Ihre andere Frage zu beantworten

Das liegt an den laufenden Arbeiten zur Modernisierung von Discourse und der Umstellung auf neue moderne Standards mit Glimmer-Komponenten.

3 „Gefällt mir“

[quote=“chapoi, post:7, topic:398553”]
und ich bin mir auch nicht sicher, ob wir den reinen HTML-Code, wie in Ihrer Fußkomponente, noch tolerieren.
[/quote]Wenn kein reines HTML(-Template), was wird dann für den Inhalt von https://www.geowebforum.ch/admin/customize/themes/3/common/footer/edit erwartet? Markdown, wie in benutzergenerierten Inhalten?

[quote=“chapoi, post:7, topic:398553”]
Diese Komponente muss also nach modernen Mustern refaktorisiert werden,
[/quote]Können Sie mir eine Anleitung geben, wie das geht? Ich fühle mich etwas verloren, da die Dokumentationen von Discourse scheinbar über das gesamte Meta-Forum verteilt sind.

[quote=“chapoi, post:7, topic:398553”]
und ich würde raten, sie auch in eine richtige Komponente zu verschieben, anstatt dort zu belassen, wo sie sich derzeit unter Admin befindet.
[/quote]Kann ich dafür einfach den „Export“ entpacken und in ein Git-Repository einchecken?

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

Es liegt an der laufenden Arbeit zur Modernisierung von Discourse und der Umstellung auf neue moderne Standards mit Glimmer-Komponenten.
[/quote]Ist meine Komponente nicht bereits eine Glimmer-Komponente, wenn sie eine *.gjs-Datei im Export hat? Oder ist das tatsächlich Teil des Problems – dass das aktuelle Discourse meine Komponente für eine Glimmer-Komponente hält (und sie daher mit diesem Dateinamen exportiert), obwohl sie es code-technisch noch nicht ist?

(Bitte entschuldigen Sie meine Ahnungslosigkeit. Ich bin kein Web-Entwickler und weiß so gut wie nichts über Ember und Glimmer.)

1 „Gefällt mir“

Ich meinte: Das rohe HTML wird mit der neuesten Version nicht mehr richtig geparst, weshalb Sie nur das HTML ausgegeben sehen, anstatt es gerendert zu bekommen.

Ja, die .gjs-Datei zeigte tatsächlich eine Glimmer-Komponente an, aber die darin verwendete Methode registerConnectorClass funktioniert (nicht mehr).

Das ist vollkommen verständlich. Was Using Plugin Outlet Connectors from a Theme or Plugin im Grunde aussagt, ist, dass wir nun ein spezifisches Element, ein sogenanntes Plugin-Outlet, verwenden, um Informationen über die Methode registerConnectorClass irgendwo auf der Seite darzustellen, so wie es Ihre footer.html-Datei getan hat. Für eine Fußzeile würde das above-footer-Outlet gut funktionieren.

Es ist wahrscheinlich eine gute Idee, sich Beginner's guide to using Discourse Themes und Developing Discourse Themes & Theme Components durchzulesen.

Es kann auch helfen, sich eine einfache Themenkomponente anzusehen, um die Struktur zu verstehen. Zum Beispiel: GitHub - discourse/discourse-minimal-footer · GitHub

Und schließlich kann Ihnen der Discourse-Bot auf dem ganzen Weg helfen: Er kennt die Discourse-Muster gut, sodass Sie ihm Ihren aktuellen Code geben, das Problem erklären und ihn bitten können, Ihnen bei der Refaktorierung zu helfen.

2 „Gefällt mir“