Fügen Sie benutzerdefinierte Inhalte hinzu, die nur auf Ihrer Startseite erscheinen

A very common situation you’ll find yourself in as a theme developer is the need to create content that only shows on the homepage of your community.

You might add some HTML to the “After Header” section of your theme, which will then appear on every page. You can jump through some hoops in CSS to hide this everywhere except the homepage… but instead let’s use a Discourse theme to create a component with content that is only visible on your homepage.

If you’re unfamiliar with Discourse themes check out Beginner's guide to using Discourse Themes and Structure of themes and theme components

In your Discourse theme you’ll need to setup the following directory structure:

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

From here we’re going to create an Ember component. You can find more about Ember components from their documentation: Ember.js Guides - Guides and Tutorials - Ember Guides

But for now this will be a simple component. The component will consist of two files, one containing the logic and another the template.

: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()}`;
  }
}

This creates a isHomepage getter, which checks the router service for the currentRouteName — if the route name matches your homepage (as dictated by site settings) then it will return true

Now we need our template

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

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

The template checks the isHomepage getter, and will display your content if it’s true. You can add any HTML you want between the {{#if}} blocks.

Now that our component is created, we need to add it to Discourse somewhere. For this step you’ll need to decide which plugin outlet to utilize. These are areas throughout Discourse where we’ve added a little code for developers to hook into. You can search Discourse for these on Github, or browse for them using the (deprecated) Plugin outlet locations theme component.

For custom homepages, above-main-container is a common choice, so let’s use that.

We need to create our connector file in the correct directory:

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

<CustomHomepageContent />

:point_up: and that’s all, it just needs a single line calling for your component :tada:


This document is version controlled - suggest changes on github.

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“