Erstellen Sie mit einem generischen BBCode-Wrapper eine Themenkomponente, die Inhalte ausblendet, wenn sie nicht in einer Gruppen-Zeichenfolgenvariablen enthalten sind.
Entwürfe anzeigen
Erstellen einer generischen BBCode-Wrapper- und Themenkomponente
Anforderungen verstehen
Basierend auf Ihrer Anfrage erstellen wir:
Ein generischer BBCode-Wrapper, der benutzerdefinierte Attribute akzeptieren kann.
Eine Themenkomponente, die Inhalte basierend auf einer Gruppen-Zeichenfolgenvariablen ausblendet, die an den BBCode-Wrapper übergeben wird.
Implementierung des BBCode-Wrappers
Wir erstellen einen BBCode-Wrapper, der beliebige Attribute akzeptieren kann. Diese Attribute werden zur Auswertung an die Themenkomponente übergeben.
Ruby
# config/initializers/bbcode.rb
Discourse::Plugins::BBCode.add_parser(:hide_if_not_in_group) do |tag, content|
attributes = tag.attributes || {}
"\u003cdiv class='hide-if-not-in-group' data-group-names='#{attributes[:groups]}'\u003e#{content}\u003c/div\u003e"
end
Code mit Vorsicht verwenden.
Erstellung der Themenkomponente
Die Themenkomponente prüft, ob der aktuelle Benutzer zu einer der Gruppen gehört, die im Attribut data-group-names angegeben sind. Wenn nicht, wird der Inhalt ausgeblendet.
JavaScript
// app/assets/javascripts/discourse/components/hide-if-not-in-group.js
import Component from 'discourse/components/component';
export default Component.extend({
tagName: 'div',
classNames: ['hide-if-not-in-group'],
didInsertElement() {
const currentUserId = Discourse.currentUser.id;
const groupNames = this.element.dataset.groupNames.split(',');
// Funktion zur Überprüfung, ob der Benutzer zu einer der angegebenen Gruppen gehört
const userIsInAnyGroup = (userId, groupNames) => {
// Ersetzen Sie dies durch Ihre Logik zur Überprüfung der Benutzergruppenmitgliedschaft
// Zum Beispiel mithilfe der Discourse-API oder benutzerdefinierter Logik
return groupNames.some(groupName => {
// Prüfen Sie, ob der Benutzer zur Gruppe mit dem Namen `groupName` gehört
// Geben Sie true zurück, wenn der Benutzer zur Gruppe gehört, andernfalls false
});
};
if (!userIsInAnyGroup(currentUserId, groupNames)) {
this.element.style.display = 'none';
}
}
});
Code mit Vorsicht verwenden.
Verwendung des BBCode
Sie können den BBCode wie folgt verwenden:
[hide_if_not_in_group groups="staff,moderators"]
Dieser Inhalt ist für Benutzer verborgen, die keine Mitarbeiter oder Moderatoren sind.
[/hide_if_not_in_group]
Wichtige Überlegungen
Überprüfung der Gruppenmitgliedschaft: Ersetzen Sie die Platzhalterlogik für die Überprüfung der Benutzergruppenmitgliedschaft durch Ihre tatsächliche Implementierung. Möglicherweise müssen Sie die Discourse-API oder benutzerdefinierte Logik verwenden, um die Gruppenmitgliedschaft zu ermitteln.
Leistung: Bei einer großen Anzahl von Benutzern oder Gruppen kann eine Optimierung der Überprüfung der Gruppenmitgliedschaft erforderlich sein.
Sicherheit: Stellen Sie eine ordnungsgemäße Validierung und Bereinigung von Gruppennamen sicher, um Sicherheitslücken zu vermeiden.
Flexibilität: Erwägen Sie, zusätzliche Attribute für den BBCode zuzulassen, um andere Verhaltensweisen zu steuern (z. B. das Anzeigen einer Nachricht anstelle des Ausblendens von Inhalten).
Wenn Sie diese Schritte befolgen, erhalten Sie einen flexiblen BBCode-Wrapper und eine Themenkomponente, die Inhalte basierend auf der Gruppenmitgliedschaft ausblenden können.
Verwendung von Gemini. Ich konnte die obigen Code-Snippets erhalten. Habe aber Schwierigkeiten, sie zum Laufen zu bringen.
Wenn mir jemand sagen kann, wo ich sie in einer benutzerdefinierten Komponente mit den Eingabeabschnitten und ggf. Codekorrekturen platzieren soll.
Der erste Fehler, der auftrat, als ich den JavaScript-Code in den gemeinsamen Bereich einfügte, war ein Fehler bei „import“, der ein { erwartete.

