In meinem Theme muss ich, sobald die Topic-Ansicht geladen wird, die ID dieses Topics abrufen (und ggf. auch den Namen, aber die ID reicht aus).
Anschließend verwende ich diese Informationen in meinem Theme, um einen API-Aufruf zu tätigen und Informationen über das Topic zu erhalten (über einen Endpunkt wie forum-name/t/topic-name/id.json …).
Wie kann ich die ID des Topics erhalten, wenn die Topic-Ansicht geladen wird?
[details=“Die naheliegenden Methoden reichen nicht aus”]
Die offensichtliche Lösung besteht darin, window.location.href oder window.location.pathname zu verwenden, um Informationen aus der URL zu extrahieren. Das Problem ist jedoch, dass die URL der Topic-Ansicht verschiedene Formen annehmen kann. Oft sieht sie so aus: forum-name/t/topic-name/topic-id
Wenn dies immer die Form wäre, würde die Verwendung von window.location.pathname gut funktionieren und mir „t/topic-name/topic-id
In meinem Forum passiert das tatsächlich meistens, wenn man auf ein Thema klickt. Der letzte Teil der URL ist dann die Nummer des Themas innerhalb der Kategorie, falls man über die Kategorie auf das Thema gelangt ist. Vielleicht ist das eine Einstellung in Discourse? Auf Meta scheint das nicht zu passieren, aber ich glaube nicht, dass ich etwas Besonderes tue, um das auf meinem Forum auszulösen.
Ich kann mich jedoch nicht immer darauf verlassen, da bei einem Thema, das das erste in der Kategorie ist, der Kategorien-Index nicht angehängt wird. Soweit ich das sehe, gibt es derzeit keine gute Möglichkeit für mich zu erkennen, ob es im Kategorien-Index erscheinen wird oder nicht.
Die ID aus einem Div zu erhalten ist in Ordnung, aber leider deutlich langsamer, als sie direkt aus der URL oder über eine andere direkte Methode zu bekommen. Falls es keine andere Lösung gibt: Weißt du, wie man mit jQuery den Wert dieses Href-Werts ausliest?
Das könnte funktionieren, ist aber nicht sehr effizient, da du für jede Seitenanzeige eines Themas für jeden Benutzer – einschließlich Anonymer – eine zusätzliche AJAX-Anfrage stellst. Das erzeugt eine erhebliche unnötige Last auf deinem Server.
Nicht wirklich. Die URL für ein Thema sieht in der Standardkonfiguration von Discourse so aus:
Das funktioniert! Vielen Dank. Ich verstehe, dass du mit der match-Methode hier die URL durchgehst, um, wie ich annehme, das dritte Vorkommen von “/” zu finden, da die ID immer nach dem dritten “/” in der URL steht, die das Format “/t/name/id/otherstuff” hat. Könntest du mir bitte kurz erklären, wie dein Regex das bewerkstelligt? Das wäre für meine Reise in die Welt der regulären Ausdrücke sehr hilfreich.
Danke für die Info. Es scheint also das „verknüpfte Beitragsnummer
Ich hätte dir bei dem Code mit Sicherheit helfen können, wenn es sich um eine Lösung in einem einzigen Schritt gehandelt hätte, aber es sind mehrere Schritte erforderlich. Wenn du Unterstützung in Form einer Beratung benötigst, um Arbeiten zu erledigen oder das Erstellen von Theme-Komponenten selbst zu erlernen, poste bitte im Marketplace, und ich melde mich bei dir.
Danke, aber jede Anleitung für jeden Schritt ist hilfreich. Wie würde ich beispielsweise, abgesehen von der Nutzung der API, alle mit einem Thema verknüpften Tags erfahren?
Ein vollständig geladenes Topic-Objekt wird auf der Client-Seite bereitgestellt, wenn du die Topic-Seite lädst. Wenn du es nun nutzen möchtest, musst du deinen eigenen Code in die Vorlage einfügen, um diese Daten zu verwenden, oder Klassen „reopen
Danke. Ich bin mit einigen der Grundlagen, die du erwähnst, vertraut, aber ein Punkt bringt mich ins Stocken (und ich wette, dass das viele andere auch verwirrt):
Auf der Topic-Ansicht wird die Vorlage /templates/components/topic-category.hbs geladen. Diese zeigt die Kategorie sowie das Tag unter dem Titel des Topics an.
In topic-category wird topic.tags aufgelistet. Das ist also der entscheidende Teil der Information, den ich brauche, um dies zum Laufen zu bringen.
Hier stecke ich fest: Wie bekomme ich diese topic.tags-Information in mein JavaScript?
Zum Beispiel: Wenn ich einfach nur den Inhalt von topic.tags in die Konsole ausgeben wollte, wie würde ich das machen?
Ich weiß, wie man Vorlagen überschreibt. Zum Beispiel könnte ich in einem Theme eine Datei unter discourse/templates/components/topic-category.hbs ablegen, die Vorlage dort erneut ausgeben und dabei die gewünschten Änderungen an der Ansicht vornehmen. (Ich verwende die separate Dateistruktur, die hier beschrieben wird).
In meinem Theme weiß ich auch, wie man JavaScript unter theme/initializers/initializer-file.js.es6 platziert.
Und ich kann die beiden mit etwas jQuery interagieren lassen. Zum Beispiel könnte ich die topic.tags in ein div in der Vorlage legen und in meinem Initializer mit jQuery darauf zugreifen, indem ich den Inhalt dieses div auslese.
Das ist jedoch umständlich. Wie kann ich die topic.tags-Information direkt erhalten, damit ich sie parsen und manipulieren kann?
Ich würde das gesamte topic mit console.log ausgeben und herausfinden, welcher Schlüssel benötigt wird. Für jQuery-Interaktionen sollten diese innerhalb von Komponenten erfolgen und auch dort stattfinden. didInsertElement ist der Komponenten-Hook, der hier nützlich ist.
Nach allem, was ich höre, scheint es, als bräuchtest du eine berechnete Eigenschaft (computed property), die von topic.tags abhängt und deine Manipulation davon auf dem betreffenden Controller oder der Komponente zurückgibt. Diese ist direkt im Template verwendbar. Gib das Ganze auch nicht auf. Es wird seine Zeit dauern, zahlt sich aber definitiv auf eine Weise aus, die du dir nicht einmal erträumen könntest.
An dieser Stelle solltest du dir wirklich die Ember-Anleitungen ansehen. Eine Komponente ist ein Funktionspaket, das du einsetzen und an andere Dinge anbinden kannst.
Danke, Leute, das sind alles hilfreiche Informationen. Ich untersuche die Anleitungen und die allgemeinen Dokumentationen. Es wäre auch sehr hilfreich zu wissen, wie der Name der Datei lautet, in die ich den (i) jQuery-Code und den (ii) didInsertElement-Code einfügen soll. Solche konkreten Informationen wären eine große Hilfe bei der weiteren Überprüfung.
Du kannst alle möglichen Ember-Klassen mit reopen erweitern und deinen Code in sie einfügen. Um ein besseres Verständnis zu bekommen, solltest du nach Plugins oder Themes suchen, die dies tun.
@JQ331 Wie du wahrscheinlich weißt, habe ich Regex-Ausdrücke bei Google gefunden und sie hier ausprobiert! Du kannst Variationen eingeben, um die besten Ergebnisse zu erzielen.
Wenn die Tags für den normalen Benutzer ausgeblendet sind, wie könnte dann ein zusätzlicher Aufruf helfen? Der Serializer sollte diese Tags in jedem Fall für den normalen Benutzer ausblenden. Wenn nicht, öffnen Sie ein Sicherheitsloch für Inhalte.
Wenn Sie all diese Mühe aufwenden, um die Einschränkungen von Änderungen nur auf der Frontend-Seite zu umgehen, würde ich Ihnen raten, den Bissen zu wagen und zu prüfen, ob Sie dies in ein Plugin integrieren können, in dem Sie in einem Schritt serialisieren können, anstatt ein unübersichtliches Setup mit zusätzlichen Aufrufen zu haben.
Das ergibt Sinn. Ich würde gerne mehr darüber erfahren, wie man den Serializer verwendet – obwohl der Serializer einer der wichtigsten Schritte in einem Discourse-Plugin ist, habe ich bisher keine Dokumentation gefunden, die grundlegende Beispiele für die Verwendung des Serializers aufzeigt. Kennst du eine solche Dokumentation?
Wenn du sagst, dass ein Serializer diese Tags ausblenden sollte, könntest du mir bitte einige Pseudocode-Beispiele geben, um mir zu verdeutlichen, was du meinst? (Es ist in Ordnung, wenn der Code nicht vollständig funktioniert – ich versuche nur, das Konzept zu verstehen.)
Das ist genau wie Jazzmusik – die bewährten Praktiken finden sich meist bereits in der bestehenden Open-Source-Plugin-Landschaft, so wie alle Aufnahmen. Erwarte keine perfekte Anleitung für alles; oft musst du dich erst in den Rhythmus (ähm) hineinfinden, um aus bestehender Arbeit zu lernen.
Suche ein Plugin aus #plugin, das etwas funktional Ähnliches leistet oder einen Teil dessen, was du erreichen möchtest, und untersuche den Code, um zu sehen, wie es die Aufgaben erfüllt. Dasselbe gilt für den Discourse-Quellcode, den du als ultimative Quelle für „Best Practices
def tags
# Der Aufruf der Methode `pluck` zusammen mit `includes` verursacht N+1-Abfragen
tags = topic.tags.map(&:name)
if scope.is_staff?
tags
else
tags - scope.hidden_tag_names
end
end
Wie Sie sehen, werden hier die versteckten Tags für Nicht-Mitarbeiter ausgeblendet.