Unterkategorien ausblenden, ohne ihre Themen in der Themenliste auszublenden?

Hey Leute,

gibt es eine Möglichkeit, Unterkategorien aus den Themenlisten auszublenden und stattdessen die übergeordneten Kategorien unter dem Titel des Themas anzuzeigen?

Mein gewünschtes Ergebnis ist eine Stammkategorie mit n Unterkategorien. Diese Unterkategorien sollen nicht im Frontend angezeigt werden. Sie dienen ausschließlich dazu, den Zugriff auf die Beiträge basierend auf der Gruppenmitgliedschaft einzuschränken.

In der Themenliste möchte ich die übergeordnete Kategorie unter dem Titel des Themas anzeigen, anstatt die Unterkategorie.

Ich habe überlegt, Tags zu verwenden, aber leider kann ich den Zugriff auf die Themen auf diese Weise nicht einschränken.

Die Vorlage für Elemente in der Themenliste zeigt nur den Link zur Kategorie des Themas an, wie hier:
{{category-link topic.category}}

Sie müssten diese Vorlage also anpassen, um Links zur übergeordneten Kategorie anzuzeigen:

{{#if topic.category.parentCategory}}
  {{category-link topic.category.parentCategory}}
{{else}}
  {{category-link topic.category}}
{{/if}}

Wenn dies jedoch nur für eine bestimmte übergeordnete Kategorie gelten soll, müssten Sie weitere Logik hinzufügen. Ich weiß nicht, was der empfohlene Weg dafür wäre – etwa das Registrieren eines Handlebars-Helfers?

Ein anderer Ansatz könnte darin bestehen, immer sowohl den Kategorien- als auch den übergeordneten Link anzuzeigen und die nicht gewünschten dann mit CSS auszublenden.

Ich habe es nicht geprüft, aber ich denke, du solltest sie mit CSS ausblenden können.

Muss ich für diesen Ansatz ebenfalls die Vorlage ändern? Ich konnte in meinem Admin-Bereich keine entsprechende Site-Einstellung finden.

Die übergeordneten Kategorien sind nicht in der Standardvorlage enthalten, also ja, ich schätze, du musst die Vorlage anpassen. Zumindest ist mir kein leichterer Weg bekannt, dies zu erreichen.

Es gibt keine Seiteneinstellung, um Vorlagen zu ändern. Ich werde dir den Code per Direktnachricht senden, damit du es ausprobieren kannst.

Im Allgemeinen solltest du vollständige Template-Überschreibungen vermeiden, da sie Wartung erfordern – du musst einen Diff durchführen und prüfen, was sich geändert hat, falls ein Discourse-Update dein Theme beschädigt.

Stattdessen kannst du einen Schritt zurücktreten und die Daten anpassen, die an das Template übergeben werden.

Das topic-list-item ist eine Ember-Komponente, sodass du api.modifyClass verwenden kannst, um die gewünschten Änderungen vorzunehmen.

Hier ist beispielsweise ein Codeausschnitt, der das Badge der übergeordneten Kategorie unter dem Titel für Unterthemen anzeigt. Wenn sich das Thema in der Hauptkategorie befindet, hat der Code keine Auswirkung.

<script type="text/discourse-plugin" version="0.8">
  const { on } = require("discourse-common/utils/decorators");

  // IDs der übergeordneten Kategorien
  const targetCategoryIds = [9, 15, 50];

  const useParentCategory = function () {
    const parentCategory = this.attrs.topic.category.parentCategory;
    const switchToParent = parentCategory && targetCategoryIds.includes(parentCategory.id)

    if (switchToParent) {
      this.attrs.topic.set("category", parentCategory);
    }
  };

  api.modifyClass("component:topic-list-item", {
    @on("didReceiveAttrs")
    setCategory() {
      useParentCategory.call(this);
    }
  });

  api.modifyClass("component:latest-topic-list-item", {
    @on("didReceiveAttrs")
    setCategory() {
      useParentCategory.call(this);
    }
  });
</script>

Das ist großartig!

Gibt es eine Möglichkeit, es auf eine oder mehrere bestimmte Kategorien zu beschränken?

Zwei verschiedene Ansätze, je nachdem, was Sie erreichen möchten. Was ist das gewünschte Ergebnis?

  1. Alle Unterkategorien unter der übergeordneten Kategorie „foo

@Johani

[quote=“Johani, Beitrag:8, Thema:195502”]

  • Alle Unterkategorien unter der übergeordneten Kategorie „foo

Ich habe das obige Snippet angepasst, um diese Änderung widerzuspiegeln. Alles, was Sie tun müssen, ist die IDs der übergeordneten Kategorien zum Array targetCategoryIds hinzuzufügen. Die Kategorie-ID finden Sie, indem Sie die Kategorie-Seite aufrufen und die URL prüfen.

 https://meta.discourse.org/c/support/6

Die „6

Danke für den Beitrag, @Johani! Ich stecke gerade erst in Ember ein … ihr seid wirklich eine große Hilfe! :pray: :relaxed:

Das ist großartig! Vielen Dank für die schnelle Hilfe.

Das ist toll zu hören!

Two Thumbs Up

Man muss sich nur ein wenig daran gewöhnen. Falls etwas im Codebase unklar ist, zögere nicht, ein Thema in der Kategorie Dev zu erstellen und mich zu taggen.

Das ist wirklich großartig. Danke dafür und danke an alle, die dir die Zeit dafür geben.

:+1:

@Johani Wo genau muss ich dieses Code-Snippet einfügen?
Ich habe versucht, es in den <head>-Bereich und den Header-Teil meines Theme-Komponenten-Teils einzufügen, wo ich mein gesamtes CSS speichere. Aber dann wird die Themenliste genau an der Stelle abgeschnitten, an der das erste betroffene Thema aus der Unterkategorie aufgelistet werden sollte.

Ja, es gab ein Problem mit der Kategorieeinstellung, das ich lokal übersehen habe. Ich habe das obige Snippet bearbeitet, und es sollte jetzt funktionieren.

Das obige Snippet ermöglicht es dir, die Kategorien festzulegen, auf denen dies funktionieren soll. Wenn du möchtest, dass es auf alle Kategorien angewendet wird, könntest du so etwas wie Folgendes verwenden.

<script type="text/discourse-plugin" version="0.8">
  const { on } = require("discourse-common/utils/decorators");

  const useParentCategory = function () {
    const parentCategory = this.attrs.topic.category.parentCategory;

    if (parentCategory) {
     this.attrs.topic.set("category", parentCategory);
    }
  };

  api.modifyClass("component:topic-list-item", {
    @on("didReceiveAttrs")
    setCategory() {
      useParentCategory.call(this);
    }
  });

  api.modifyClass("component:latest-topic-list-item", {
    @on("didReceiveAttrs")
    setCategory() {
      useParentCategory.call(this);
    }
  });
</script>

Danke @Johani für deine Hilfe, ich schätze das wirklich sehr!