En utilisant un wrapper BBCode générique, créez un composant de thème qui masque le contenu s’il ne se trouve pas dans une variable de chaîne de groupe.
Afficher les brouillons
Création d’un wrapper BBCode générique et d’un composant de thème
Comprendre les exigences
Sur la base de votre demande, nous allons créer :
Un wrapper BBCode générique qui peut accepter des attributs personnalisés.
Un composant de thème qui masque le contenu en fonction d’une variable de chaîne de groupe passée au wrapper BBCode.
Implémentation du wrapper BBCode
Nous allons créer un wrapper BBCode qui peut accepter des attributs arbitraires. Ces attributs seront transmis au composant de thème pour évaluation.
Ruby
# config/initializers/bbcode.rb
Discourse::Plugins::BBCode.add_parser(:hide_if_not_in_group) do |tag, content|
attributes = tag.attributes || {}
"<div class='hide-if-not-in-group' data-group-names='#{attributes[:groups]}'>#{content}</div>"
end
Utilisez le code avec prudence.
Création du composant de thème
Le composant de thème vérifiera si l’utilisateur actuel appartient à l’un des groupes spécifiés dans l’attribut data-group-names. Sinon, il masquera le contenu.
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(',');
// Fonction pour vérifier si l'utilisateur fait partie de l'un des groupes spécifiés
const userIsInAnyGroup = (userId, groupNames) => {
// Remplacez ceci par votre logique pour vérifier l'appartenance de l'utilisateur aux groupes
// Par exemple, en utilisant l'API de Discourse ou une logique personnalisée
return groupNames.some(groupName => {
// Vérifiez si l'utilisateur fait partie du groupe nommé `groupName`
// Retournez true si l'utilisateur fait partie du groupe, sinon false
});
};
if (!userIsInAnyGroup(currentUserId, groupNames)) {
this.element.style.display = 'none';
}
}
});
Utilisez le code avec prudence.
Utilisation du BBCode
Vous pouvez utiliser le BBCode comme ceci :
[hide_if_not_in_group groups="staff,moderators"]
Ce contenu est masqué pour les utilisateurs qui ne sont ni du personnel ni des modérateurs.
[/hide_if_not_in_group]
Considérations importantes
Vérification de l’appartenance aux groupes : remplacez la logique de substitution pour la vérification de l’appartenance aux groupes par votre implémentation réelle. Vous pourriez avoir besoin d’utiliser l’API de Discourse ou une logique personnalisée pour déterminer l’appartenance aux groupes.
Performance : pour un grand nombre d’utilisateurs ou de groupes, l’optimisation de la vérification de l’appartenance aux groupes pourrait être nécessaire.
Sécurité : assurez une validation et une assainissement appropriés des noms de groupes pour éviter les vulnérabilités de sécurité.
Flexibilité : envisagez d’autoriser des attributs supplémentaires pour le BBCode afin de contrôler d’autres comportements (par exemple, afficher un message au lieu de masquer le contenu).
En suivant ces étapes, vous disposerez d’un wrapper BBCode et d’un composant de thème flexibles qui peuvent masquer le contenu en fonction de l’appartenance aux groupes.
Utilisation de Gemini. J’ai réussi à obtenir les extraits de code ci-dessus. Cependant, j’ai du mal à les faire fonctionner.
Si quelqu’un peut me guider sur l’endroit où placer dans un composant personnalisé avec les sections pour saisir et corriger le code si nécessaire.
La première erreur qui est apparue lorsque j’ai mis le JavaScript dans le commun était une erreur sur « import » que j’attendais d’un {
[Détails=“Capture d’écran de l’erreur”]
[/Détails]

