Discourse Plugins entwickeln - Teil 1 - Ein Basis-Plugin erstellen

Hmmmm. That’s a tricky one, because the symlink needed to be deleted, otherwise the Docker mount fails (as it cannot overwrite the existing file).

I had a bit of a google around for solutions, and found an interesting solution which would dereference the symlink and copy the symlink’s target into the specified directory, but couldn’t find anything that would create a Docker volume mount, thus preserving the dynamic link and bi-directional synchronisation. Happy to be steered towards a solution as this would be a neat feature to have.

Erzähl mir, wie man deine Validierung zum Modell app/models/user.rb hinzufügt?

1 „Gefällt mir“

Du kannst regulären Ruby-Code verwenden, um dies in deiner plugin.rb zu tun:

class ::User < ActiveRecord::Base
  validates_presence_of :your_attribute
end
6 „Gefällt mir“

Ich fange gerade mit meinem ersten kleinen Plugin an :blush: Ich habe ein paar Fragen, hoffe, jemand kann mir helfen…

Meine erste Frage: Macht es einen Unterschied, ob wir das verwenden, was in diesem Leitfaden steht, oder sollten wir wirklich den Plugin-Generator nutzen?

Das wurde in diesem Leitfaden nicht behandelt, aber wie können wir Daten aus der Datei plugin.rb für unsere Templates verfügbar machen?

Nehmen wir zum Beispiel an, ich möchte eine zufällige Willkommensnachricht am Plugin-Auslass topic-above-posts anzeigen, wenn jemand ein Thema besucht, wobei die Nachricht zufällig aus einem Array in plugin.rb ausgewählt wird… Wie würde ich diese Daten an das Template senden? Das würde meines Erachtens hier landen:

plugins/my_new_plugin/assets/javascripts/discourse/templates/connectors/topic-above-posts/my_new_plugin.hbs (Ist das korrekt?)

Jede Hilfe wird sehr geschätzt :blush:

2 „Gefällt mir“

Die Verwendung des Plugin-Generators ist im Allgemeinen ein hervorragender Weg, um einen Einstieg zu finden und zu verstehen, wie ein Plugin strukturiert sein sollte. Ich empfehle ihn.

Was nun die Einbindung von Ruby-Code in das Frontend betrifft: Es handelt sich um zwei verschiedene Anwendungen. Die Frontend-Anwendung (Ember) muss die Daten auf irgendeine Weise vom Server (Rails) anfordern. Normalerweise geschieht dies über einen AJAX-Aufruf, Sie könnten aber auch etwas wie eine Erweiterung des SiteSerializers hinzufügen, damit die Daten automatisch als Teil der Forendaten gesendet werden.

Andernfalls müssen Sie nachschauen, wie man in Rails eine Route und einen Controller hinzufügt und die Nachrichten als JSON sendet.

8 „Gefällt mir“

Danke, Robin!

Wüsstest du, ob es dazu Tutorials gibt? Oder gibt es ein einfaches Plugin (oder sogar ein Dummy-Plugin), an dem wir uns orientieren können? (Falls nicht, könntest du das vielleicht kurz irgendwo für uns hochladen? Ich denke, das würde vielen Leuten helfen :blush:)

Außerdem: Hast du noch weitere Gedanken zum Schreiben eines Buches? Ich kann dich gerne mit jemandem in Verbindung bringen, falls du Lust hast :smiley:

1 „Gefällt mir“

Danke für das Kompliment, aber ich bin definitiv viel zu beschäftigt, um an ein Buch zu denken. Außerdem haben Tech-Bücher einen SUPER begrenzten Leserkreis. Diejenigen, die ich kenne und die welche geschrieben haben, sagen, man macht das für sich selbst, nicht für das Geld :slight_smile:

Ich kann mir kein einfaches Plugin vorstellen, das etwas vom Server zurückgibt. discourse-tooltips fügt eine Route hinzu und nutzt diese, um Vorschauen von Themen beim Überfahren mit der Maus zu erhalten – das könnte hilfreich sein.

8 „Gefällt mir“

Bald werde ich mit der Plugin-Entwicklung beginnen…

Frage:

Gibt es eine Liste von hooks, an denen wir tatsächlich ein Plugin anbinden können?

Zum Beispiel: Wenn wir ein Plugin schreiben möchten, das die gekochten Daten in einem Beitrag verarbeitet, bevor sie angezeigt werden, würden wir erwarten, dass es mindestens einen Hook am Anfang und einen am Ende gibt, wie zum Beispiel:

  • display_post_start

  • display_post_complex

Dann würde unser Plugin an der Hook-Position unserer Wahl im Code oben ansetzen.

Gibt es eine Liste dieser Plugin-Hooks und wie heißen diese Plugin-Hooks in DiscourseWorld?

Update: Ich habe Folgendes gefunden:

git grep "plugin-outlet" -- "*.hbs"

Aber ich konnte keinen Outlet zum Ändern des gekochten Beitragsinhalts finden.

Gibt es ein Tutorial zum Erstellen eigener Outlets, zum Beispiel eines Outlets, um den gekochten Teil von Beiträgen zu ändern?

2 „Gefällt mir“

Du suchst nach diesem Leitfaden, Abschnitt decorateCooked():

5 „Gefällt mir“

Ich verwende dieses Skelett für ein benutzerdefiniertes Plugin. Muss ich etwas für den bevorstehenden Ember 5-Übergang ändern?

Ich nehme an nicht? Obwohl dies nur ein Linter ist?

1 „Gefällt mir“

Das Skelett ist mit Ember 5 kompatibel. Wenn Sie jedoch JavaScript-Code oder HBS-Vorlagen hinzugefügt haben, müssen Sie die im Ankündigung beschriebenen Deprecations überprüfen.

Ja, die Dinge in package.json beziehen sich nur auf das Linting, sie beeinträchtigen die Funktionalität oder Kompatibilität eines Plugins nicht.

3 „Gefällt mir“

Bitte fügen Sie dies hinzu

rake plugin:create[plugin-name]

Ich habe heute zu lange gebraucht, um Automating Discourse Plugin Setup with `create-discourse-plugin` gem zu finden (ich bin mir nicht sicher, wie ich mich nicht an den Namen dieser Rake-Aufgabe erinnern konnte?! :person_shrugging: )

5 „Gefällt mir“

Ich würde auch eine Notiz hinzufügen, wenn Sie die Docker-Einrichtung verwenden, da die obigen Anweisungen mit einem Fehler ähnlich dem folgenden fehlschlagen werden:

ambientimpact:~/.../Discourse/discourse$ d/rake plugin:create[neurocracy-date-rewrite]
Cloning 'https://github.com/discourse/discourse-plugin-skeleton' to '/src/plugins/neurocracy-date-rewrite'...
Initializing git repository...
Initialized empty Git repository in /src/plugins/neurocracy-date-rewrite/.git/
Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: empty ident name (for <discourse@localhost>) not allowed
rake aborted!
Command failed with exit 128: git
/src/lib/tasks/plugin.rake:354:in `system'
/src/lib/tasks/plugin.rake:354:in `block (2 levels) in <main>'
/src/lib/tasks/plugin.rake:344:in `chdir'
/src/lib/tasks/plugin.rake:344:in `block in <main>'
Tasks: TOP => plugin:create
(See full trace by running task with --trace)

Sie müssen zuerst Ihre .gitconfig innerhalb des Containers einrichten (ändern Sie E-Mail und Name nach Bedarf), bevor Sie versuchen, das Plug-in zu erstellen:

d/exec git config --global user.email "you@example.com"
d/exec git config --global user.name "Your Name"
d/rake plugin:create[plugin-name]
1 „Gefällt mir“