グループ文字列変数に基づいてコンテンツを非表示にする、汎用BBCodeラッパーとテーマコンポーネントを作成します。
下書きを表示
汎用BBCodeラッパーとテーマコンポーネントの作成
要件の理解
ご要望に基づき、以下を作成します。
カスタム属性を受け入れられる汎用BBCodeラッパー。
BBCodeラッパーに渡されたグループ文字列変数に基づいてコンテンツを非表示にするテーマコンポーネント。
BBCodeラッパーの実装
任意の属性を受け入れられるBBCodeラッパーを作成します。これらの属性は、評価のためにテーマコンポーネントに渡されます。
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
コードの使用は注意してください。
テーマコンポーネントの作成
テーマコンポーネントは、現在のユーザーがdata-group-names属性で指定されたグループのいずれかに属しているかどうかを確認します。属していない場合は、コンテンツを非表示にします。
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(',');
// 指定されたグループのいずれかにユーザーがいるかどうかを確認する関数
const userIsInAnyGroup = (userId, groupNames) => {
// ユーザーグループメンバーシップを確認するには、ここにあなたのロジックを置き換えてください
// 例: DiscourseのAPIまたはカスタムロジックを使用する
return groupNames.some(groupName => {
// `groupName` という名前のグループにユーザーがいるか確認する
// ユーザーがグループにいる場合はtrueを返し、そうでない場合はfalseを返す
});
};
if (!userIsInAnyGroup(currentUserId, groupNames)) {
this.element.style.display = 'none';
}
}
});
コードの使用は注意してください。
BBCodeの使用
BBCodeは次のように使用できます。
[hide_if_not_in_group groups="staff,moderators"]
このコンテンツは、スタッフまたはモデレーターではないユーザーには非表示になります。
[/hide_if_not_in_group]
重要な考慮事項
グループメンバーシップのチェック: ユーザーグループメンバーシップを確認するためのプレースホルダーロジックを、実際のインプリメンテーションに置き換えてください。グループメンバーシップを判断するために、DiscourseのAPIまたはカスタムロジックを使用する必要がある場合があります。
パフォーマンス: 大量のユーザーまたはグループの場合、グループメンバーシップチェックの最適化が必要になる場合があります。
セキュリティ: グループ名の適切な検証とサニタイズを行い、セキュリティ脆弱性を防いでください。
柔軟性: BBCodeに他の属性を許可して、他の動作を制御することを検討してください(例: コンテンツを非表示にする代わりにメッセージを表示する)。
これらの手順に従うことで、グループメンバーシップに基づいてコンテンツを非表示にできる、柔軟なBBCodeラッパーとテーマコンポーネントが得られます。
Geminiを使用しています。上記のコードスニペットを取得できましたが、機能させるのに苦労しています。
カスタムコンポーネントにどこに配置し、コードを必要に応じて修正・入力するか、ガイドしていただけますか?
JavaScriptをcommonに配置した際に最初に発生したエラーは、「import」が期待通りに機能しないというものでした。

