# Topic ID als Variable?

**URL:** https://meta.discourse.org/t/topic-id-as-a-variable/374168
**Category:** Development
**Created:** [14. Juli 2025 um 18:48 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168 "2025-07-14T18:48:32Z")
**Posts on this page:** 15
**Page:** 2

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [26. September 2025 um 15:34 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/21 "2025-09-26T15:34:15Z")

</div>

> [@NateDhaliwal](#):
>
> Vielleicht, wenn Sie ein gängiges Wort in Support-Tickets oder einfach ein gängiges Wort im Allgemeinen haben, können Sie das versuchen? Ich schlage nur eine Problemumgehung vor.

Ein gängiges Wort ist das Gegenteil von dem, was ich will. Ich möchte nicht, dass meine Suchergebnisse JEDES Ticket enthalten, ich möchte eine Möglichkeit, nach einem bestimmten Ticket zu suchen. Deshalb wäre die Topic-ID ideal. Sie werden automatisch generiert und sind eindeutig.

> [@pfaffman](#):
>
> Haben Sie den Code in [Topic ID as a variable? - #7 by awesomerobot](https://meta.discourse.org/t/topic-id-as-a-variable/374168/7) ausprobiert?

Nein, ich glaube, der Code, den ich verwende, war ursprünglich auch von awesomerobot, aber ich kann seine Quelle nicht mehr finden.  
Ich bevorzuge die Platzierung dessen, was ich derzeit verwende, besser als diesen Block unter dem Text.

> [@](#):
>
> Auch wenn Sie nach einer Topic-ID “suchen” möchten, könnten Sie wahrscheinlich eine Komponente erstellen, die eine Topic-ID akzeptiert und dann einfach zu diesem Topic springt.

Nun, das kann ich nicht. Vielleicht können Sie das.  
`„Ich habe einen bestimmten Satz von Fähigkeiten. Programmieren gehört nicht dazu.“`

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [26. September 2025 um 15:46 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/22 "2025-09-26T15:46:19Z")

</div>

> [@tknospdr](#):
>
> Nun, das kann ich nicht. Vielleicht können Sie es.  
> `<Stimme von Liam Neeson>Ich besitze ein gewisses Set an Fähigkeiten. Programmieren gehört nicht dazu.</Stimme von Liam Neeson>`

Dann sollten Sie diesen Beitrag vielleicht in #Marketplace oder #Contribute > Feature verschieben.

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [27. September 2025 um 03:01 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/23 "2025-09-27T03:01:01Z")

</div>

> [@tknospdr](#):
>
> Ein gebräuchliches Wort ist das Gegenteil von dem, was ich will. Ich möchte nicht, dass meine Suchergebnisse JEDES Ticket enthalten, ich möchte eine Möglichkeit, nach einem bestimmten Ticket zu suchen. Deshalb wäre die Topic-ID ideal. Sie werden automatisch generiert und sind eindeutig.

Sie missverstehen mich. Ich meinte, ein gebräuchliches Wort _einschließlich_ des Parameters `topic:id` zu haben, sodass nur Ergebnisse _aus diesem Topic_ angezeigt werden. Das gebräuchliche Wort macht es überflüssig, Wörter wie ‘hi’ und ‘hello’ zu ändern.

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [27. September 2025 um 11:41 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/24 "2025-09-27T11:41:46Z")

</div>

@tknospdr @pfaffman Ich habe schnell eine Komponente zusammengestellt, mit der Sie die Topic-ID eingeben und dorthin springen können.

Erstellen Sie eine neue Komponente und fügen Sie dies zum JS-Tab unter der Schaltfläche CSS/HTML bearbeiten hinzu\[1\]:

```gjs
import { apiInitializer } from "discourse/lib/api";
import Component from '@glimmer/component';
import { action } from "@ember/object";
import Form from "discourse/components/form";
import DiscourseURL from "discourse/lib/url";

export default apiInitializer((api) => {
    api.renderBeforeWrapperOutlet("full-page-search-filters",
        class GoToTopic extends Component {
            @action
            handleSubmit(data) {
                DiscourseURL.routeTo(`/t/${data.id}`);
            }

            <template>
                <div class="topic-id-go-to" style="margin-top: 1em;">
                    <Form @onSubmit={{this.handleSubmit}} as |form|>

                      <form.Field @name="id" @title="Topic id" as |field|>
                        <field.Input @type="number" @validation="required" />
                      </form.Field>

                      <form.Submit />
                    </Form>
                </div>
            </template>
        }
    );
});

```

Dies fügt ein Eingabefeld zur Suchseite hinzu:

 ![image](https://global.discourse-cdn.com/meta/original/4X/e/9/9/e9915704639e3338e6942515239d20308ae4886b.png)  
Die Schaltfläche Submit dient zum Aufrufen des Topics\[2\]; sie hat keine Auswirkungen auf die Suchergebnisse.

Ich hoffe, das hilft!

* * *

1. Mein erster Versuch mit FormKit, es ist wirklich cool! 

2. Ich konnte den Text der Schaltfläche nicht ändern, da dies Lokalisierungen erfordern würde… was ein ganzes TC-Repository benötigen würde, was vielleicht übertrieben ist 🤷.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [29. September 2025 um 14:35 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/25 "2025-09-29T14:35:57Z")

</div>

Danke @NateDhaliwal, ich schätze die Mühe.  
Ich habe die Komponente erstellt, den Code in den JS-Tab eingefügt. Ich habe sichergestellt, dass sie in meinem Theme aktiv ist, aber es hat nicht funktioniert.  
So sieht meine Suchseite aus:

 ![search](https://global.discourse-cdn.com/meta/original/4X/9/1/8/91893cc41593bb95f52ee8c3c5f9a160545e0592.jpeg)

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [29. September 2025 um 14:50 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/26 "2025-09-29T14:50:36Z")

</div>

> [@awesomerobot](#):
>
> Wenn Sie den Code Ihres Themes unter `admin > Themes & Komponenten` bearbeiten… und dies zum JS-Tab hinzufügen, sollten Sie mit einigen Anpassungen das gewünschte Ergebnis erzielen:

Ich habe dies auf meiner Website eingerichtet, um damit herumzuspielen, und es scheint zu funktionieren. Allerdings erhalte ich diese Warnung, die mich etwas zögern lässt:

 ![deco-error](https://global.discourse-cdn.com/meta/original/4X/3/1/1/3117e5c04f1aea585ad93a8cbda7615aafbb7d68.jpeg)

---

<div class="post-metadata">

### Author: ![NateDhaliwal](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/natedhaliwal/32/313494_2.png) [@NateDhaliwal](https://meta.discourse.org/u/NateDhaliwal)
#### Post date: [29. September 2025 um 14:51 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/27 "2025-09-29T14:51:41Z")

</div>

Gibt es Fehler in der Browserkonsole?

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [29. September 2025 um 14:54 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/28 "2025-09-29T14:54:39Z")

</div>

Das ist der einzige Fehler:

 ![render-error](https://global.discourse-cdn.com/meta/original/4X/0/e/1/0e103c4837c31cc42a311632e4400c3d81e66e6c.jpeg)

Und ich denke, das liegt daran, dass das JS die Topic-ID anzeigen soll, nicht die Suche. Sie wird nur auf den Seiten angezeigt, die ich für dieses Element vorgesehen habe.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [29. September 2025 um 15:33 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/29 "2025-09-29T15:33:53Z")

</div>

Ich habe die Komponente „Erweiterte Suchleiste“ deaktiviert und dann wieder aktiviert, und jetzt funktioniert sie.  
🤷‍♂️

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [29. September 2025 um 17:50 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/30 "2025-09-29T17:50:12Z")

</div>

Hier ist eine Zusammenfassung der aktuellen Situation:

1. Wir haben eine funktionierende Lösung. Obwohl sie etwas unschön ist, wird sie meinen Bedürfnissen entsprechen, bis wir die Topic-ID direkt in der Standard-Suchbox suchen können.
2. ~~Der von @awesomerobot vorgeschlagene Code scheint zu funktionieren, löst aber die oben gepostete Warnung aus.~~  
2a. Als ich den ursprünglichen Code, den ich zur Anzeige der Topic-ID verwendete, entfernte, verschwand diese Warnung…
3. Wenn Sie eine Lösung auswählen, wird der Code zur Anzeige der Topic-ID sowohl im ursprünglichen Beitrag als auch in der Lösung angezeigt. Gibt es eine Möglichkeit, dies zu berücksichtigen und zu verhindern, dass er dort angezeigt wird?  
 ![double-vision](https://global.discourse-cdn.com/meta/original/4X/0/d/1/0d1da731ce810577cdd50563c089f31c6b20990f.jpeg)
4. Ich habe das CSS etwas aufgehübscht, jetzt habe ich einen Pill auf jeder Antwort in jedem Thread in den angegebenen Kategorien, in denen ich dies verwende. Ich nehme an, die Antwort wird sein, es nicht mehr aufzuhübschen, aber wenn jemand eine andere Möglichkeit kennt, würde ich es lieber behalten, ich finde, es sieht so gut aus.  
 ![pill](https://global.discourse-cdn.com/meta/original/4X/b/b/d/bbd1868045a5425dc162d14f607d6dc7a3d04a55.jpeg)

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [30. September 2025 um 15:09 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/31 "2025-09-30T15:09:45Z")

</div>

@awesomerobot  
Dein Code funktioniert hervorragend, aber es scheint, dass alle CSS-Dekorationen außer Text auf jedem Beitrag nach dem ersten als leerer Raum erscheinen, der so formatiert ist, wie es das CSS vorgibt.

Schalte Inline-Block aus und du erhältst eine durchgehende Farbleiste.  
Ändere die Hintergrundfarbe und die Pille ändert die Farbe  
usw…

Basierend auf dem, was du geschrieben hast, sieht es so aus, als hättest du gesagt, dass es nur im ersten Beitrag angezeigt werden soll, aber das betrifft nur den Text. Gibt es noch etwas, das wir tun können, um das Element bei allen zusätzlichen Beiträgen zu entfernen?

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [1. Oktober 2025 um 14:11 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/32 "2025-10-01T14:11:11Z")

</div>

Okay, wie gesagt, ich bin kein Coder, aber ich bin verdammt gut darin, Grok Fragen zu stellen. Hier ist Code, der sich um beide Probleme kümmert.

1. Keine leeren CSS-Blasen mehr in Antworten 2 bis X.
2. Keine Duplizierung der Topic-ID mehr in zitierten Lösungen.

Vielleicht kümmert sich niemand sonst auf der Welt darum, aber das scheint eine gute Möglichkeit zu sein, Topics für diejenigen von uns zu verfolgen, die Discourse als Ticketsystem nutzen.

````gjs
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";

class TopicIdentifier extends Component {
  get topicId() {
    return this.args.post?.topic?.id;
  }

  get shouldShow() {
    const firstPost = this.args.post?.post_number === 1; // erster Post im Topic
    const desiredCategories = [9, 23]; // eine durch Kommas getrennte Liste von Kategorie-IDs, in denen dies erscheinen soll
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- Sie können den Inhalt unten bearbeiten, {{this.topicId}} ist, wo die Topic-ID eingefügt wird -->
      Issue Tracking # ist
      {{this.topicId}}
      <!-- Sie können den Inhalt oben bearbeiten -->
    {{/if}}
  </template>
}

export default apiInitializer("0.8.40", (api) => {
  api.decorateCookedElement((element, helper) => {
```gjs
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";

class TopicIdentifier extends Component {
  get topicId() {
    return this.args.post?.topic?.id;
  }

  get shouldShow() {
    const firstPost = this.args.post?.post_number === 1; // erster Post im Topic
    const desiredCategories = [9, 23]; // eine durch Kommas getrennte Liste von Kategorie-IDs, in denen dies erscheinen soll
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- Sie können den Inhalt unten bearbeiten, {{this.topicId}} ist, wo die Topic-ID eingefügt wird -->
      Issue Tracking # ist
      {{this.topicId}}
      <!-- Sie können den Inhalt oben bearbeiten -->
    {{/if}}
  </template>
}

export default apiInitializer("0.8.40", (api) => {
  api.decorateCookedElement((element, helper) => {
    // Nur fortfahren, wenn dies der erste Post ist und nicht innerhalb eines Lösungszitates
    // Nur fortfahren, wenn dies der erste Post ist, nicht in einem Zitat und in der gewünschten Kategorie
    const post = helper?.model;
    const desiredCategories = [9, 23]; // Stimmt mit den Kategorien aus TopicIdentifier überein
    if (
    if (
      helper?.model?.post_number !== 1 ||
      !post ||
      post.post_number !== 1 ||
      !desiredCategories.includes(post.topic?.category?.id) || // Kategorie prüfen
      element.classList.contains("post__contents-cooked-quote") || // Prüfen, ob das Element selbst der Zitatinhalt ist
      element.closest("aside.accepted-answer") || // Auf Lösungs-/Zitat-Wrapper prüfen
      element.closest(".quote") // Zusätzliche Prüfung auf generische Zitate
    ) {
      return;
    }

    const wrapper = document.createElement("div");
    wrapper.className = "tracking-id";

    helper?.renderGlimmer(
      wrapper,
      <template><TopicIdentifier @post={{helper.model}} /></template>
    );

    element.appendChild(wrapper);
  });
});

````

---

<div class="post-metadata">

### Author: ![awesomerobot](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/awesomerobot/32/142900_2.png) [@awesomerobot](https://meta.discourse.org/u/awesomerobot)
#### Post date: [1. Oktober 2025 um 14:22 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/33 "2025-10-01T14:22:34Z")

</div>

Ich konnte mich nicht früher darum kümmern, aber ich bin froh, dass Sie es herausgefunden haben! Das sieht nach einer vernünftigen Lösung aus.

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [1. Oktober 2025 um 14:35 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/34 "2025-10-01T14:35:18Z")

</div>

Ich weiß, dass ich es leicht testen kann, aber wissen Sie aus dem Stegreif, ob dies funktionieren würde, wenn ich dieses JS und CSS in eine eigene Komponente packen würde, oder muss es im Theme selbst sein?

---

<div class="post-metadata">

### Author: ![tknospdr](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/tknospdr/32/529762_2.png) [@tknospdr](https://meta.discourse.org/u/tknospdr)
#### Post date: [6. Oktober 2025 um 17:11 UTC](https://meta.discourse.org/t/topic-id-as-a-variable/374168/35 "2025-10-06T17:11:56Z")

</div>

Ich habe eine weitere kleine Anomalie gefunden. Ich sah die leeren Klassenblasen im ersten Beitrag von Themen außerhalb der 2, in denen ich sie haben wollte, also musste ich den Code ein wenig aktualisieren. Hier ist das Endergebnis.

```gjs
import { apiInitializer } from "discourse/lib/api";
import Component from "@glimmer/component";

class TopicIdentifier extends Component {
  get topicId() {
    return this.args.post?.topic?.id;
  }

  get shouldShow() {
    const firstPost = this.args.post?.post_number === 1; // erster Beitrag im Thema
    const desiredCategories = [9, 23]; // eine durch Kommas getrennte Liste von Kategorie-IDs, in denen dies erscheinen soll
    const isInCategory = desiredCategories.includes(
      this.args.post?.topic.category.id
    );

    return firstPost && isInCategory;
  }

  <template>
    {{#if this.shouldShow}}
      <!-- Sie können den Inhalt unten bearbeiten, {{this.topicId}} ist, wo die Thema-ID eingefügt wird -->
      Issue Tracking # ist
      {{this.topicId}}
      <!-- Sie können den Inhalt oben bearbeiten -->
    {{/if}}
  </template>
}

export default apiInitializer("0.8.40", (api) => {
  api.decorateCookedElement((element, helper) => {
    // Nur fortfahren, wenn dies der erste Beitrag ist und nicht innerhalb eines Lösungszitates
    // Nur fortfahren, wenn dies der erste Beitrag ist, nicht in einem Zitat, und in der gewünschten Kategorie
    const post = helper?.model;
    const desiredCategories = [9, 23]; // Stimmt mit den Kategorien von TopicIdentifier überein
    if (
    if (
      helper?.model?.post_number !== 1 ||
      !post ||
      post.post_number !== 1 ||
      !desiredCategories.includes(post.topic?.category?.id) || // Kategorie prüfen
      element.classList.contains("post__contents-cooked-quote") || // Prüfen, ob das Element selbst der Zitatinhalt ist
      element.closest("aside.accepted-answer") || // Nach Lösungs-/Zitat-Wrapper suchen
      element.closest(".quote") // Zusätzliche Prüfung auf generische Zitate
    ) {
      return;
    }

    const wrapper = document.createElement("div");
    wrapper.className = "tracking-id";

    helper?.renderGlimmer(
      wrapper,
      <template><TopicIdentifier @post={{helper.model}} /></template>
    );

    element.appendChild(wrapper);
  });
});
      element.classList.contains("post__contents-cooked-quote") || // Prüfen, ob das Element selbst der Zitatinhalt ist
      element.closest("aside.accepted-answer") || // Nach Lösungs-/Zitat-Wrapper suchen
      element.closest(".quote") // Zusätzliche Prüfung auf generische Zitate
    ) {
      return;
    }

    const wrapper = document.createElement("div");
    wrapper.className = "tracking-id";

    helper?.renderGlimmer(
      wrapper,
      <template><TopicIdentifier @post={{helper.model}} /></template>
    );

    element.appendChild(wrapper);
  });
});

```

> [@tknospdr](#):
>
> Ich weiß, dass ich es leicht testen kann, aber weißt du aus dem Stegreif, ob das funktionieren würde, wenn ich diesen JS- und CSS-Code in seine eigene Komponente packen würde, oder muss er im Theme selbst sein?

Und um meine eigene Frage zu beantworten, ich habe den gesamten Code in eine neue Theme-Komponente verschoben und alles funktioniert weiterhin einwandfrei.

[Vorherige Seite](https://meta.discourse.org/t/topic-id-as-a-variable/374168.md?page=1)
