私のWebサイトでは、コメント内のStarsと呼ばれるFivestarフィールドを介して、ユーザーがお互いのノードを評価できます。次に、ユーザーの全体的な平均スコアを計算します。つまり、すべてのノードのユーザーの平均スコアを表示したいと思います。
例えば。ユーザーが2つのノードを作成したとします:Node 1 andNode 2。彼のコンテンツ:
その場合、全体の平均は(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>
何が悪かったのか?
このようなことは 計算フィールド で実行できることを知っています。いくつかのPHPコードが必要です。いくつかの説明を参照してください こちら
これはあなたがする必要があることです:
(既にカスタムモジュールがある場合は、この手順をスキップできます)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
このカスタム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);
}
楽しい!これで、ユーザーのページにあるすべてのユーザーのノードの評価の加重平均が表示されます。
イェロエン、
まず、この情報をどこに表示しますか?これがユーザーページの場合は Computed Field を使用します。それ以外の場合は、リストページやビューなどの場合は Views PHP を使用できます。どちらの場合も、結果をフェッチするためにコーディングする必要があります。ユーザーのノードをフェッチし、すべてのノードのすべての評価を合計してから、平均を取る必要があります。これはあなたの結果でしょう。
私は最近この問題に再び遭遇しましたが、この古い質問について考えずに、数分でビューアグリゲーションを使って自分で解決しました。私のソリューションを、プログラミングに(まだ)参加していない人のための代替回答として追加したいと思います。ビューは次のように設定されています。
できた!これをDrupalの初心者として読んでいる場合は、このストーリーを一種の安心として解釈できます。あきらめないでください。信じられなくても、大きな進歩を遂げます。まだ。
試しましたか Views Aggregation ?少しの作業でそれはあなたが必要とするものを行うことができると思います。
質問の「ビューでの作業も問題ない」という別のアプローチ:
関連するデータ、フィルター、並べ替えなどを含むビューを作成します。
Views_calc モジュールを使用して、ビュー結果の下に平均を表示します。
以下はそのようなテーブルの典型的なスクリーンプリントです:
詳細については、「 ファイブスターノードの平均投票を表示するにはどうすればよいですか? 」に関する質問への私の回答を参照してください。
開示:私はこのモジュールのco-maintainerです。
これがサイトの 自己宣伝に関するポリシー に違反しないことを願っています。