web-dev-qa-db-ja.com

Fivestarを使用して、すべてのノードでユーザーの平均評価を計算する方法は?

私のWebサイトでは、コメント内のStarsと呼ばれるFivestarフィールドを介して、ユーザーがお互いのノードを評価できます。次に、ユーザーの全体的な平均スコアを計算します。つまり、すべてのノードのユーザーの平均スコアを表示したいと思います。

例えば。ユーザーが2つのノードを作成したとします:Node 1 andNode 2。彼のコンテンツ:

  • ノード1のスコア:4/5、5/5、3/5
  • ノード2のスコア:4/5、4/5

その場合、全体の平均は(4 + 5 + 3 + 4 + 4)/ 5 = 4になります。

できれば、この結果も星として表示する必要があります。

どうやってやるの?


編集1:計算フィールド モジュールの操作は、この問題を解決するための一般的な考えのようです。私には見栄えがよく、簡単にアクセスできるようにするには、ユーザーの平均スコアをユーザーフィールドに格納するのが最善だと思います。 (ビューでの作業も問題ありません。)平均スコアをプロファイルページに表示する予定ですが、将来的にはWebサイトの他の場所でも使用する予定です。

私が使用することになっているコードの(スケッチ)を手伝ってくれませんか?


編集2:Gemiddeldeというユーザーフィールドを作成し、カスタムモジュールに@ Thomas4019のコードを貼り付けましたhiderating(モジュールのタイトルは以前の質問を参照しています)が、次のエラーが発生しました:

  • 警告:341行目でC:\ wamp\www\mysite\sites\all\modules\computed_field\computed_field.moduleに呼び出され、computed_field_field_gemiddelde_display()で定義されているcompute_field_field_gemiddelde_display()の引数5がありません
    C:\ wamp\www\mysite\sites\all\modules\hiderating\hiderating.module)。
  • 通知:未定義の変数:Computed_field_field_gemiddelde_display()のエンティティ(C:\ wamp\www\mysite\sites\all\modules\hiderating\hiderating.moduleの30行目)。
  • Notice:compute_field_field_gemiddelde_display()で非オブジェクトのプロパティを取得しようとしています(C:\ wamp\www\mysite\sites\all\modules\hiderating\hiderating.moduleの30行目)。

プロファイルページのビューのGemiddeldeフィールドには次の値があります。

<div class="fivestar-basic"><div class="fivestar-widget-static fivestar-widget-static-vote fivestar-widget-static-5 clearfix"><div class="star star-1 star-odd star-first"><span class="off">0</span></div><div class="star star-2 star-even"><span class="off"></span></div><div class="star star-3 star-odd"><span class="off"></span></div><div class="star star-4 star-even"><span class="off"></span></div><div class="star star-5 star-odd star-last"><span class="off"></span></div></div></div><div class="fivestar-summary fivestar-summary-average-count"><span class="empty">No votes yet</span></div> 

編集3:計算フィールドモジュールを再インストールしてキャッシュをクリアした後、エラーメッセージは表示されなくなりましたが、Gemiddelde私のビューのフィールドには、次のCSSコードが引き続き表示されます。

<div class="fivestar-basic"><div class="fivestar-widget-static fivestar-widget-static-vote fivestar-widget-static-5 clearfix"><div class="star star-1 star-odd star-first"><span class="on">3</span></div><div class="star star-2 star-even"><span class="on"></span></div><div class="star star-3 star-odd"><span class="on"></span></div><div class="star star-4 star-even"><span class="off"></span></div><div class="star star-5 star-odd star-last"><span class="off"></span></div></div></div><div class="fivestar-summary fivestar-summary-average-count"><span class="average-rating">Average: <span >3</span></span> <span class="total-votes">(<span>1</span> vote)</span></div>

何が悪かったのか?

5
Jeroen

このようなことは 計算フィールド で実行できることを知っています。いくつかのPHPコードが必要です。いくつかの説明を参照してください こちら

これはあなたがする必要があることです:

  1. Computed FieldとFivestarをインストールする
  2. admin/config/people/accounts/fieldsに移動し、ユーザーエンティティタイプに計算フィールドを作成します。私の場合、「field_computed_rating」という名前を付けました。フィールドの設定フォームで、[データベースに値を保存する]チェックボックスがチェックされていないであることを確認してください。
  3. フィールドを作成したコンテンツタイプの[ディスプレイの管理]をクリックします。次に、そのフィールドのフォーマットが「無害化」に設定されていることを確認します。
  4. (既にカスタムモジュールがある場合は、この手順をスキップできます)sites/all/modules内のコードベースで、fivestar_user_aggregateというタイトルの新しいフォルダーを作成します。そのフォルダー内で、次の内容を含むfivestar_user_aggregate.infoを作成する必要があります。

    name = Fivestar User Aggregate
    description = Assign users an aggregate rating based on all their nodes
    core = 7.x
    package = Custom
    
  5. このカスタムphp関数をモジュールファイルに追加するか、次の内容でfivestar_user_aggregate内にfivestar_user_aggregate.moduleを作成します。フィールドに別の名前を付けた場合は、それに応じて関数名を変更する必要があります。

    <?php
    
    function computed_field_field_computed_rating_display($field, $entity_field_item, $entity_lang, $langcode, $entity) {
        $result = db_query("SELECT n.uid, n.nid, vote1.value AS count, vote2.value AS average FROM {node} n
    INNER JOIN {votingapi_cache} vote1 ON n.nid = vote1.entity_id
    AND vote1.function =  'COUNT'
    INNER JOIN {votingapi_cache} vote2 ON n.nid = vote2.entity_id
    AND vote2.function =  'average'
    WHERE n.uid = :uid", array(':uid' => $entity->uid));
    
        $rating_count = 0;
        $rating_total = 0;
    
        $nodes = $result->fetchAll();
        foreach ($nodes as $node) {
            $rating_count += $node->count;
            $rating_total += $node->average * $node->count;
        }
    
        if ($rating_total == 0) {
            $weighted = 0;
        } else {
            $weighted = $rating_total / $rating_count;
        }
    
        $variables = array(
            "rating" => $weighted,
            "average_rating" => $weighted,
            "votes"  => $rating_count,
            "stars" => 5
        );
        $variables["widget"]["name"] = "basic";
        $variables["widget"]["css"] = "sites/all/modules/fivestar/widgets/basic/basic.css";  
        drupal_add_css(drupal_get_path('module', 'fivestar') .'/css/fivestar.css');
        return theme('fivestar_static', $variables) . theme('fivestar_summary', $variables);
    }
    
  6. 楽しい!これで、ユーザーのページにあるすべてのユーザーのノードの評価の加重平均が表示されます。

9
Thomas4019

イェロエン、

まず、この情報をどこに表示しますか?これがユーザーページの場合は Computed Field を使用します。それ以外の場合は、リストページやビューなどの場合は Views PHP を使用できます。どちらの場合も、結果をフェッチするためにコーディングする必要があります。ユーザーのノードをフェッチし、すべてのノードのすべての評価を合計してから、平均を取る必要があります。これはあなたの結果でしょう。

2
Vaibhav Jain

私は最近この問題に再び遭遇しましたが、この古い質問について考えずに、数分でビューアグリゲーションを使って自分で解決しました。私のソリューションを、プログラミングに(まだ)参加していない人のための代替回答として追加したいと思います。ビューは次のように設定されています。

  • コメントを表示するソートされていない新しいビューを作成します。
  • 詳細設定で、コンテンツ(つまり、コメントを受け取ったノード)に既に関係があることを確認します。
  • コンテンツの作成者uidにコンテキストフィルターを追加します。私の場合、ユーザーページにビューを表示するため、URLのデフォルト値をuidに設定します。
  • 次に、詳細設定のOtherセクションで集計を有効にします。
  • フィールドStarsを追加し、値をスターとして表示して、集計設定を平均(タイプ)と評価(グループ)に変更します。
  • 必要に応じてフィルターを追加します。たとえば、私は特定のタイプの公開されたノードに対してゼロ以外の投票で承認されたコメントをフィルタリングしました。

できた!これをDrupalの初心者として読んでいる場合は、このストーリーを一種の安心として解釈できます。あきらめないでください。信じられなくても、大きな進歩を遂げます。まだ。

0
Jeroen

試しましたか Views Aggregation ?少しの作業でそれはあなたが必要とするものを行うことができると思います。

0

質問の「ビューでの作業も問題ない」という別のアプローチ:

  1. 関連するデータ、フィルター、並べ替えなどを含むビューを作成します。

  2. Views_calc モジュールを使用して、ビュー結果の下に平均を表示します。

以下はそのようなテーブルの典型的なスクリーンプリントです:

Views Calc screenprint

詳細については、「 ファイブスターノードの平均投票を表示するにはどうすればよいですか? 」に関する質問への私の回答を参照してください。

開示:私はこのモジュールのco-maintainerです。
これがサイトの 自己宣伝に関するポリシー に違反しないことを願っています。

0
Pierre.Vriens