Eigene Inhalte hinzufügen, die nur auf deiner Startseite erscheinen

Eine sehr häufige Situation, in die man als Theme-Entwickler gerät, ist die Notwendigkeit, Inhalte zu erstellen, die nur auf der Startseite deiner Community angezeigt werden.

Du könntest etwas HTML in den Bereich „After Header“ deines Themes einfügen, das dann auf jeder Seite erscheinen würde. Du könntest mit CSS einige Akrobatik betreiben, um dies überall außer auf der Startseite zu verstecken … aber stattdessen lass uns ein Discourse-Theme verwenden, um eine Komponente mit Inhalten zu erstellen, die nur auf deiner Startseite sichtbar sind.

Falls du mit Discourse-Themes nicht vertraut bist, schau dir Beginner's guide to using Discourse Themes und Structure of themes and theme components an.

In deinem Discourse-Theme musst du 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 findest du in deren Dokumentation: Ember.js Guides - Guides and Tutorials - Ember Guides

Aber für jetzt wird dies eine einfache Komponente sein, geschrieben als einzelne .gjs-Datei, die sowohl die Logik als auch die Vorlage enthält.

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

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

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

Dies erstellt einen isHomepage-Getter, der den Router-Service nach dem currentRouteName prüft – wenn der Routenname deiner Startseite entspricht (wie durch die Seiteneinstellungen vorgegeben), wird true zurückgegeben. Die Vorlage innerhalb von <template>...</template> prüft diesen Getter und zeigt deine Inhalte nur dann an, wenn er true ist. Du kannst zwischen den {{#if}}-Blöcken beliebiges HTML hinzufügen.

Da unsere Komponente erstellt ist, müssen wir sie irgendwo in Discourse hinzufügen. Für diesen Schritt musst du entscheiden, welchen Plugin-Ausgang (Plugin Outlet) du nutzen möchtest. Dies sind Bereiche in Discourse, in denen wir etwas Code hinzugefügt haben, damit Entwickler anknüpfen können. Du kannst diese auf Github in Discourse durchsuchen oder sie unter (deprecated) Plugin outlet locations theme component durchsuchen.

Für benutzerdefinierte Startseiten ist above-main-container eine gängige Wahl, also lass uns das verwenden.

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

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

import CustomHomepageContent from "../../components/custom-homepage-content";

<template><CustomHomepageContent /></template>

:point_up: und das war’s, es braucht nur eine einzelne Zeile, die deine Komponente aufruft :tada:


Dieses Dokument wird versioniert – Vorschläge für Änderungen auf 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“