Voting API Widgets

Voting APIをベースに構築された柔軟なフィールドベースの投票システムで、5つ星評価、いいねボタン、役に立った/役に立たなかった投票など、すぐに使える投票ウィジェットを提供します。

votingapi_widgets
1,129 sites
42
drupal.org

概要

Voting API Widgetsは、Voting APIモジュールを拡張し、任意のコンテンツEntityに簡単に追加できるフィールドベースの投票システムを提供します。このモジュールには3つの組み込み投票ウィジェットタイプが含まれています:複数のビジュアルテーマを持つ5つ星評価システム、シンプルないいねボタン、そして役に立った/役に立たなかった(サムズアップ/ダウン)ウィジェットです。

このモジュールはDrupalのFieldシステムを活用しており、サイト構築者は標準のField設定インターフェースを通じて任意のEntityタイプに投票機能を追加できます。各投票フィールドは、異なる投票タイプ、匿名ユーザーと認証済みユーザー両方のロールオーバーウィンドウ、さまざまな表示オプションで個別に設定できます。

すべての投票操作はAJAXで処理され、ページのリロードなしにシームレスなユーザー体験を提供します。このモジュールは、各投票フィールドインスタンスに対して動的に生成されるパーミッションによる細かな権限制御を提供し、誰が投票、投票の編集、投票のクリア、または投票ステータスの管理ができるかを詳細に制御できます。

開発者はPHP 8 AttributesまたはDoctrine Annotationsを使用してカスタム投票ウィジェットプラグインを作成することで、モジュールを拡張できます。プラグインシステムは、カスタムフォーム、値、表示ロジックを持つ新しい投票スタイルを実装するためのクリーンなアーキテクチャを提供します。

Features

  • DrupalのField UIを通じて任意のコンテンツEntityに追加できるフィールドベースの投票システム
  • 3つの組み込み投票ウィジェット:5つ星評価、いいねボタン、役に立った/役に立たなかった投票
  • 5つ星ウィジェットは、CSSスター、FontAwesomeスター、Bootstrapスター、各種バースタイルなど9種類のビジュアルテーマをサポート
  • ページリロードなしのシームレスなユーザーインタラクションを実現するAJAXベースの投票
  • ユーザーが投票を変更できる頻度を制御する設定可能な投票ロールオーバーウィンドウ(即時から無期限まで)
  • 匿名ユーザーと認証済みユーザーで個別のロールオーバー設定
  • 投票、投票の編集、投票のクリア、投票ステータスの管理に対するフィールドインスタンスごとの動的なパーミッション生成
  • 最適なパフォーマンスのためにDrupalの#lazy_builderを使用した投票フォームの遅延読み込み
  • フィールド固有の平均値、カウント、有用性評価を計算するカスタム投票結果関数
  • PHP 8 Attributesを使用してカスタム投票ウィジェットを作成できる拡張可能なプラグインシステム
  • ウィジェット固有およびEntity固有のオーバーライドを可能にする投票サマリーテンプレートのテーマサジェスチョン
  • 投票ウィジェットと一緒に結果サマリーを表示するサポート
  • ユーザー自身の投票または集計結果を表示するオプション

Use Cases

記事評価システム

記事に5つ星評価フィールドを追加し、読者がコンテンツの品質を評価できるようにします。Formatterで結果サマリーを表示するよう設定し、洗練された外観のために「fontawesome-stars」テーマを使用します。エンゲージメントを最大化するために匿名ユーザーに投票権限を付与します。

ソーシャルいいね機能

ブログ投稿やコメントにFacebookスタイルのいいねボタンを実装します。コンテンツタイプに「like」プラグインのvoting_api_fieldを追加します。いいね数がボタンの横に表示され、ソーシャルプルーフとエンゲージメント指標を提供します。

ヘルプ記事フィードバック

「useful」ウィジェットを使用して、ドキュメントやFAQページに「これは役に立ちましたか?」機能を追加します。ユーザーはサムズアップまたはダウンで投票でき、集計結果は改善が必要なコンテンツを特定するのに役立ちます。

商品レビュー

5つ星評価で商品レビューシステムを作成します。Formatterの「show_results」オプションを使用して、平均評価と投票数を表示します。各ユーザーが商品を一度だけ評価できるようにするために、user_windowを「Never」に設定します。

コメント投票

コミュニティモデレーションを可能にするためにコメントに投票を追加します。ユーザーはusefulウィジェットを使用して、Stack OverflowやRedditのように、役立つコメントをアップボートしたり、役に立たないコメントをダウンボートしたりできます。

投票スタイルのコンテンツ

コンテンツタイプに投票フィールドを追加して軽量な投票を作成します。投票ステータスをオープン/クローズに切り替えて投票がアクティブな時期を制御でき、期間限定の投票イベントに便利です。

Tips

  • テーマサジェスチョンを使用して、ウィジェットタイプまたはコンテンツタイプごとに投票サマリーテンプレートをカスタマイズできます。テンプレートは次のパターンに従います:votingapi-widgets-summary--[plugin]--[entity_type]--[bundle]--[field_name].html.twig
  • トラフィックの多いサイトでは、遅延読み込み機能(#lazy_builder)が投票フォームのレンダリングを延期することでページロードパフォーマンスの向上に役立ちます
  • 「show_own_vote」Formatter設定は、ユーザーが既存の投票を確認および変更したい編集フォームで便利です
  • カスタム投票ウィジェットを作成する場合は、VotingApiWidgetBaseを拡張し、VotingApiWidgetInterfaceを実装してください。プラグイン定義にはPHP 8 Attributesを使用します
  • 投票ロールオーバー設定は、「Votingapi default」に設定されている場合、Voting APIのグローバル設定から継承します。サイト全体のデフォルトは/admin/config/search/votingapiで設定します
  • このモジュールはVote Entityに「field_name」ベースフィールドを追加し、投票をEntityタイプだけでなく特定のフィールドに関連付けることができます

Technical Details

権限 4
タイプ[entity_type]のバンドル[bundle]のフィールド[field_name]で投票

指定された投票フィールドでユーザーが投票を行うことを許可する動的に生成されるパーミッション。各voting_api_fieldインスタンスに対して1つのパーミッションが作成されます。

タイプ[entity_type]のバンドル[bundle]のフィールド[field_name]で投票を編集

指定された投票フィールドでユーザーが以前に行った投票を変更することを許可する動的に生成されるパーミッション。

タイプ[entity_type]のバンドル[bundle]のフィールド[field_name]で投票をクリア

指定された投票フィールドからユーザーが以前に行った投票を削除することを許可する動的に生成されるパーミッション。

タイプ[entity_type]のバンドル[bundle]のフィールド[field_name]で投票を開始または終了

指定された投票フィールドの特定のコンテンツアイテムで投票を開始または終了することをユーザーに許可する動的に生成されるパーミッション。

Hooks 1
hook_votingapi_widgets_voting_api_widget_info_alter

モジュールが投票ウィジェットプラグイン定義を変更することを可能にします。

Troubleshooting 6
ステータスページでjQuery Bar Ratingライブラリが見つからないエラー

GitHub(https://github.com/antennaio/jquery-bar-rating)からjQuery Bar Ratingライブラリをダウンロードし、/libraries/jquery-bar-rating/ディレクトリに配置します。jquery.barrating.min.jsファイルは/libraries/jquery-bar-rating/dist/jquery.barrating.min.jsに配置する必要があります。

5つ星ウィジェットが正しく表示されない

jQuery Bar Ratingライブラリが正しくインストールされ、CSSテーマファイルがアクセス可能であることを確認してください。ブラウザコンソールでJavaScriptエラーを確認してください。ライブラリのインストール後にDrupalキャッシュをクリアしてください。

匿名ユーザーが投票できない

パーミッションが付与されていることを確認してください。People > Permissionsに移動し、「Vote on type [entity_type] from bundle [bundle] in field [field_name]」パーミッションを探してください。これを匿名ロールに付与します。

ユーザーが複数回投票できてしまう

フィールド設定の投票ロールオーバーウィンドウ設定を確認してください。重複投票を防ぐために、「Anonymous vote rollover」と「Registered user vote rollover」を「Never」または適切な時間間隔に設定します。

モジュールをアンインストールできない

モジュールをアンインストールする前に、すべてのvoting_api_fieldインスタンスを削除する必要があります。各コンテンツタイプのManage fieldsページに移動し、まず投票フィールドを削除してください。

投票後に投票結果が更新されない

投票結果はパフォーマンスのためにキャッシュされています。Drupalキャッシュをクリアしてみてください。Viewsを使用して結果を表示している場合は、Viewがキャッシュされていないか、適切なキャッシュ設定があることを確認してください。

Security Notes 4
  • パーミッションはフィールドインスタンスごとに動的に生成され、細かなアクセス制御を提供します。新しい投票フィールドを追加した後は常にパーミッションを確認してください。
  • 匿名投票はIPベースの識別を使用しており、これは回避される可能性があります。重要な投票の場合は、認証を要求することを検討してください。
  • 投票ロールオーバーウィンドウは投票操作を防ぐのに役立ちますが、決意のあるユーザーは複数の投票を送信する方法を見つける可能性があります。
  • AJAXコールバックはサーバー側で投票パーミッションを検証し、クライアント側の制限がバイパスされても不正な投票を防ぎます。