Benutzerdefinierte Inhalte hinzufügen, die nur auf Ihrer Homepage angezeigt werden

Eine sehr häufige Situation, in der Sie sich als Theme-Entwickler wiederfinden werden, ist die Notwendigkeit, Inhalte zu erstellen, die nur auf der Homepage Ihrer Community angezeigt werden.

Möglicherweise fügen Sie etwas HTML zum Abschnitt „After Header“ Ihres Themes hinzu, das dann auf jeder Seite angezeigt wird. Sie könnten einige Umwege in CSS gehen, um dies überall außer auf der Homepage auszublenden … aber lassen Sie uns stattdessen eine Discourse-Theme verwenden, um eine Komponente mit Inhalten zu erstellen, die nur auf Ihrer Homepage sichtbar sind.

Wenn Sie mit Discourse-Themes nicht vertraut sind, lesen Sie bitte Beginner's guide to using Discourse Themes und Structure of themes and theme components

In Ihrem Discourse-Theme müssen Sie die folgende Verzeichnisstruktur einrichten:

:file_folder: javascripts/discourse/components/
:file_folder: javascripts/discourse/connectors/

Von hier aus werden wir eine Ember-Komponente erstellen. Weitere Informationen zu Ember-Komponenten finden Sie in deren Dokumentation: Ember.js Guides - Guides and Tutorials - Ember Guides

Aber vorerst wird dies eine einfache Komponente sein. Die Komponente besteht aus zwei Dateien, eine enthält die Logik und die andere die Vorlage.

:page_facing_up: javascripts/discourse/components/custom-homepage-content.js

import Component from "@glimmer/component";
import { service } from "@ember/service";
import { defaultHomepage } from "discourse/lib/utilities";

export default class CustomHomepageContent extends Component {
  @service router;

  get isHomepage() {
    const { currentRouteName } = this.router;
    return currentRouteName === `discovery.${defaultHomepage()}`;
  }
}

Dies erstellt einen isHomepage-Getter, der den Router-Service nach dem currentRouteName abfragt – wenn der Routenname mit Ihrer Homepage übereinstimmt (wie durch die Site-Einstellungen festgelegt), wird true zurückgegeben.

Nun benötigen wir unsere Vorlage

:page_facing_up: javascripts/discourse/components/custom-homepage-content.hbs

{{#if this.isHomepage}}
  <h1>This is my homepage HTML content</h1>
{{/if}}

Die Vorlage überprüft den isHomepage-Getter und zeigt Ihren Inhalt an, wenn dieser true ist. Sie können beliebigen HTML-Code zwischen die {{#if}}-Blöcke einfügen.

Nachdem unsere Komponente erstellt wurde, müssen wir sie irgendwo in Discourse hinzufügen. Für diesen Schritt müssen Sie entscheiden, welchen Plugin-Outlet Sie verwenden möchten. Dies sind Bereiche in ganz Discourse, in denen wir ein wenig Code hinzugefügt haben, in den Entwickler einsteigen können. Sie können diese auf Github durchsuchen oder sie mithilfe von (deprecated) Plugin outlet locations theme component durchsuchen.

Für benutzerdefinierte Homepages ist above-main-container eine übliche Wahl, also verwenden wir diese.

Wir müssen unsere Connector-Datei im richtigen Verzeichnis erstellen:

:page_facing_up: javascripts/discourse/connectors/above-main-container/custom-homepage-connector.hbs

<CustomHomepageContent />

:point_up: und das ist alles, es benötigt nur eine einzige Zeile, die nach Ihrer Komponente ruft :tada:


Dieses Dokument wird versioniert – schlagen Sie Änderungen auf github vor.

47 „Gefällt mir“

Hallo @awesomerobot,

Vielen Dank für die Erklärung. Ich habe die von Ihnen vorgeschlagenen Schritte ausprobiert, aber das von mir implementierte after_header wird auf den Detailseiten der Beiträge immer noch angezeigt. Können Sie mir empfehlen, wie ich dies beheben kann, damit es nur auf meiner Homepage angezeigt wird?

1 „Gefällt mir“

Hallo @Cornelius, ist es in Ordnung, deinen Code anzusehen?

2 „Gefällt mir“

Es wäre großartig, dies für die moderne Nutzung des Dateisystems neu zu schreiben, anstatt alles in die Header-Tags zu packen.

Die meisten dieser alten Anleitungen für Themes sind veraltet, was die Art und Weise betrifft, wie Dinge jetzt gemacht werden.

7 „Gefällt mir“

Ja, das war ziemlich veraltet! Ich habe es aktualisiert, um die Struktur von Remote-Themes und unsere modernen Ember-Komponenten widerzuspiegeln.

6 „Gefällt mir“

Das ist großartig!

Und ist dieser getter dasselbe wie dieser http://ember-cli-page-object.js.org/docs/v1.11.x/api/getter.html? Ich weiß gerade genug, um gefährlich zu sein. Wenn es dasselbe ist, werde ich die OP bearbeiten, um darauf zu verlinken.

3 „Gefällt mir“

@awesomerobot Hallo Kris, ich habe Discourse lokal auf meinem System installiert. Was ist der richtige Pfad, um diese Dateien in meiner lokalen Instanz von Discourse hinzuzufügen? Ich wollte eine neue Theme-Komponente in meiner lokalen Instanz von Discourse hinzufügen.

1 „Gefällt mir“

Sie würden Ihre Theme-Komponente erstellen und sie über die ux installieren.

Installieren Sie ein Theme oder eine Theme-Komponente

Installieren Sie die Discourse Theme CLI-Konsolenanwendung, die Ihnen beim Erstellen von Themes hilft

4 „Gefällt mir“

Wenn ich meine Homepage auf der Kategorieansicht aufbaue, erhalte ich trotzdem meine benutzerdefinierten Inhalte, auch wenn ich zu /categories gehe, was nicht die Home-URL ist. Ich möchte dies auf nur die Stamm-URL / beschränken, was meiner Meinung nach das vorherige Code tat, aber ich frage mich, ob defaultHomepage() dies tun sollte.

3 „Gefällt mir“

discovery.${defaultHomepage()} passt zur Route, die mit der top-menu-Einstellung als Startroute festgelegt ist. Sie passt sowohl zur Stamm-URL / ALS AUCH zur spezifischen Route, wie z. B. /categories.

Nach meiner Erfahrung gibt es zwei Komplikationen beim Erstellen einer benutzerdefinierten Homepage, die auf defaultHomepage() basiert:

  • Die Route, auf der sie basiert, ist nicht mehr als einfache Listenansicht verfügbar
  • Mitglieder können ihre eigene Standard-Homepage in ihren Benutzeroberflächeneinstellungen festlegen. Man muss also entweder diese Funktion deaktivieren oder tatsächlich ein Homepage-Konzept haben, das für jede der Top-Menü-Routen funktioniert.

Um eine benutzerdefinierte Homepage nur für die Stamm-URL zu erstellen, kann man router.currentURL === '/' überprüfen. Standardmäßig passt dies nur zur Stamm-URL / und nicht zur Startroute, die mit der Top-Menü-Einstellung festgelegt ist. Es gibt jedoch jetzt eine Logik für die Links in der Seitenleiste, die zusätzlich versucht, eine gegebene URL mit einer Route abzugleichen. Daher funktioniert sie standardmäßig nicht mit Links in der Seitenleiste. Ich habe gerade ein Thema dazu gepostet: Can I have sidebar links that don’t resolve an url to a route?

Nach meinem Verständnis gibt es derzeit keine Standardmethode, um eine benutzerdefinierte Homepage für die Stamm-URL zu erstellen, ohne entweder eine Route aus dem Top-Menü anzusprechen oder Probleme mit der Seitenleiste zu bekommen. Es wäre großartig, diese Option zu haben.

4 „Gefällt mir“

Stimmt, es ist eine Art langjähriger Hack, dass / und die entsprechende /route unterschiedliche Inhalte rendern können. Wir haben eine To-do-Liste, um:

  1. Die Startseite unabhängig von der top_menu-Einstellung festlegen zu können.
  2. Eine neue, eigenständige Startseitenvorlage hinzuzufügen, die angepasst werden kann, ohne eine bestehende Route zu übernehmen.

Benutzerdefinierte Startseiten sind zu diesem Zeitpunkt eine sehr häufige Anfrage, daher könnten wir hier sicherlich mehr Flexibilität gebrauchen.

6 „Gefällt mir“