Ich versuche, ein Plugin zu erstellen, das Folgendes leistet:
Neben den Composer-Feldern gibt es eine neue Schaltfläche “Suchen”.
Wenn auf die Schaltfläche geklickt wird, erscheint ein Overlay mit einem Suchformular.
Das Suchformular ermöglicht es dem Benutzer, Suchbegriffe einzugeben (sagen wir, einen Stadtnamen), und eine Suche mit einer proprietären Bildsuchmaschine (die unter meiner eigenen URL mit einem API-Schlüssel läuft) wird ausgelöst, um nach Bildern dieser Stadt zu suchen.
Die Top 5 Bilder werden dem Benutzer angezeigt. Der Benutzer wählt ein Bild aus, das Overlay verschwindet, das Bild und der Suchbegriff werden dann als Entwurf in den Composer eingefügt. Der Benutzer kann nun weiterschreiben, was auch immer sein Beitrag war.
Mein tatsächlicher Anwendungsfall ist etwas komplizierter, aber das ist ungefähr das, was ich erreichen möchte. Das Ziel ist einfach, dem Benutzer zu helfen, Beitragsentwürfe mit Bildern viel bequemer zu erstellen, als zur Suchmaschine zu gehen und manuell ein Bild in den Composer zu kopieren, um einen Entwurf zu erstellen.
Ich habe es bereits geschafft, ein Plugin mit einer neuen Schaltfläche zu erstellen, die den Composer-Field als Verbindung nutzt. Die Schaltfläche kann geklickt werden und löst eine Aktion aus. Aber jetzt stecke ich fest.
Einige Fragen:
Gibt es Plugins, die mir das Leben leichter machen würden? Ich dachte vielleicht an das Pavilion Wizard Plugin, aber ich habe gesehen, dass API-Aufrufe nur in der kostenpflichtigen Version enthalten sind, und im Moment ist es für mich noch zu früh, um zu entscheiden, ob es sich lohnt, Geld dafür auszugeben.
Was ist die richtige CSS-Klasse / div-ID, die ich für die Aktivierung eines Overlays ansprechen könnte?
Was wäre ein gutes Beispiel, um herauszufinden, wie man einen API-Aufruf über das Backend macht? Ich möchte den API-Schlüssel der Suchmaschine nicht an den Client weitergeben, daher muss er über das Backend laufen.
Ich bin mir nicht sicher, was die Plugin-API eigentlich ist und ob ich sie bräuchte. (Ich habe ein wenig Schwierigkeiten mit der Dokumentation, die überall verstreut ist.)
In der Zwischenzeit habe ich einige informative Ressourcen gefunden. Ich wünschte wirklich, diese könnten im Tutorial “Wie schreibe ich ein Plugin” prominenter platziert werden. Für Anfänger ist es nicht offensichtlich, dass sie überhaupt existieren.
Discourse’s eigene API (nicht hilfreich für das Schreiben von Plugins, aber für Anfänger dennoch relevant): https://docs.discourse.org/
Ich habe auch verstanden, dass die Backend Plugin API im Wesentlichen Rails oder Ruby ist - aber es ist nicht klar, wie genau Frontend und Backend miteinander interagieren oder wo der anfängliche “Hook” für das Backend liegt. Sicher, es gibt eine plugin.rb-Datei, die platziert werden muss, aber ich frage mich, ob es Dokumentationen darüber gibt, was der Einstiegspunkt in diese Datei ist. Vielleicht ist das für Ruby on Rails-Programmierer völlig offensichtlich, aber ich bin keiner von ihnen, daher ist der Einstieg hier steil.
Es scheint nicht, dass Sie Änderungen am Backend benötigen. Das von Ihnen beschriebene Verhalten ähnelt stark dem unserer “Hyperlink einfügen”-Modal – Sie können nach Themen suchen, eines davon als Link auswählen und ein Link wird zum Composer hinzugefügt, wenn Sie bestätigen.
Sie können den Button zu einem Plugin-Outlet oder zur Toolbar über eine api.onToolbarCreate hinzufügen, die zu einem Initialisierer hinzugefügt wird, und ein Modal ähnlich wie bei unserem “Hyperlink einfügen”-Modal öffnen. Es kann Text hinzufügen zum Composer, indem es das toolbarEvent-Objekt von der Toolbar-Aktion nutzt (wenn Sie ein Outlet benötigen, können Sie auch über appEvents-Trigger mit dem Composer interagieren).
Danke, das ist sehr hilfreich. Ja, ein Modal scheint tatsächlich das zu sein, wonach ich suche: Es unterbricht den Ablauf des Benutzers, und erst wenn der Benutzer das Modal abgeschlossen hat, kehrt alles zum vorherigen Zustand zurück. Ich werde mir ansehen, wie das „Hyperlink einfügen“-Modal funktioniert.
Frage: Wo finde ich Dokumentationen für DModal, DButton und andere solche Discourse-spezifischen Objekte?