ノードに複数の軸コメントレビューを付けたいです。
例-次の基準でレストランを評価してください:食べ物、飲み物、雰囲気、場所。
平均投票に従ってビュー内のノードを並べ替えたいのですが。
質問:
[〜#〜]更新[〜#〜]
問題をよりよく説明するために、スクリーンショットと正確な数値を以下に示します。
更新2
ここに投稿してくださった皆さん、ありがとうございました。
それでも投票を正しく集計することはできませんが、ビューの設定に原因があると思います。
賞金を授与し、完全に解決したらすぐに使用したコード/ソリューションを投稿します。 Ayesh と junedkazi はほぼ同じことを言って正しい答えを出したと思います。完全に解決したら確認します。
最終更新
投票がノードで正しく集計されていません。カスタムモジュールは、各コメントの「全体」の値を計算しており、期待どおりに機能します。しかし、fivestar/votingapiがノードビューページとビューリストページで親ノードの投票を計算すると、機能しません。 最後のレビューのみを考慮し、残りは考慮しません。
念のため、カスタムモジュールで使用している計算コードは次のとおりです。
/**
* Implements hook_comment_presave().
*/
function MYMODULE_comment_presave($comment) {
// Keep these as separate variables so the code doesn't have to be
// updated if the number of axis has been changed from admin.
$axis_count = 0;
$rating_sum = 0;
// Go through all elements and check if this is a rating field.
// Avoid hardcoding the field names (except the overall field).
foreach ($comment as $element_id => $element) {
if (is_array($element) && isset($element[LANGUAGE_NONE][0]['rating'])) {
$rating_sum += $element[LANGUAGE_NONE][0]['rating'];
$axis_count++;
}
}
// Trim out eventual weird decimals
$overall = number_format($rating_sum / $axis_count, 0);
// Save the value in the overall field
$comment->field_overall[LANGUAGE_NONE][0]['rating'] = $overall;
}
誰かが何かアイデアがあれば本当に感謝します。賞金の有効期限が切れたとしても、私はそれを有効な解決策として授与します(ポイントについては気にしません)。
Fivestarウィジェット
Fivestarウィジェットは投票平均ではなくパーセント平均として値を保存すると思います。言い換えると、Fivestarウィジェットは0〜5ではなく0〜100の値を格納しています。
Fivestarウィジェットで0〜5つ星を収集している場合、各星は20の価値があります。これが、平均「2つ星」の場合、40の値が表示される理由です(2 * 20 = 40)。
これを拡張するには:
これは、表示された出力を20で割ることで簡単に修正できます。
そこから、あなたの見解はすでに適切に設定されていると思います。
これがここでは関係がない場合は、回答を書き直します。
同様のユースケースがありましたが、コメントを使用する代わりに、レビューと呼ばれる別のノードタイプを作成しました。
Fivestar設定を使用して複数の軸を作成しました。また、平均を格納する平均投票軸。
この後、「星(表示中に評価)」というノードタイプに各軸を作成し、表示設定で露出したチェックボックスがオフになっていることを確認します。
この後、レビュータイプの同じフィールドを再利用し(あなたの場合はコメントになります)、ウィジェットタイプを「スター(編集中に評価)」に設定し、適切な親参照を選択します。
また、フィールドアクセス許可モジュールをインストールし、レビューコンテンツタイプで通常のユーザーから平均投票軸を非表示にする適切なアクセス許可を設定しました。 hook_form_alter
でも同じことができます。
次に、この小さなコードを追加して、他のすべての軸に基づいて平均投票を計算しました。あなたの場合、それはhook_comment_presaveになります。
この場合、エンティティAPIモジュールbcozがあると想定しています。私はentity_metadata_wrapper
関数を使用しています。
function hook_node_presave($node) {
if ($node->type == 'review') {
// get all fivestar fields
$fields = field_read_fields(array('type' => 'fivestar'));
// load the wrapper with node information
$wrapper = entity_metadata_wrapper('node', $node);
// to hold each axis vote
$total = array();
foreach ($fields as $field_name => $field) {
// make sure your field belongs to the same bundle and is not deleted
// and is not the avg vote field
if (($fivestar_field = field_read_instance('node', $field_name, $node->type)) && (!$fivestar_field['deleted']) && ($fivestar_field['field_name'] != 'field_average_rating')) {
// Get the axis value
$value = $wrapper->$field_name->value();
// place the value in the total array
$total[] = $value;
}
}
$node->field_average_rating[LANGUAGE_NONE][0]['rating'] = array_sum($total)/count($fields);
}
}
ビューの関係とフィールドを設定して、ノードを合計評価で並べ替える方法を教えてください。
結果を投票してタグを定義するには、関係を追加する必要があります。 (#2を参照)。
各軸のファイブスター設定で個別の投票タグを作成する必要がありますか?
はい!
これは、D7のファイブスターの箱から出して可能ですか?
自動的に計算された全体的なフィールドが必要な場合は、特別な設定は必要ありません。計算フィールドモジュールについての議論がありますが、カスタムモジュール(hook_comment_presaveを使用して投票全体を計算する)に時間を費やす必要がありました。
多軸投票の背後にある主な概念は、タグです。まず、投票API設定ページで複数のタグを追加する必要があります。デフォルトは「投票」ですが、食べ物、飲み物、雰囲気、場所、そしておそらく全体が必要になります。あなたがそうするモジュールを作らない限り、全体的な計算は少し難しいかもしれないことに注意してください。
最初に、4つの異なるタグの下にあるコメントフォームに4つのフィールドを追加します(または、全体の1つが必要な場合は5つ。他の4つのフィールドから全体を計算する場合は、後で行います)。
各フィールドは、編集時に(コメントを残しながら)使用(評価)できます。評価対象、親ノード。 But個々の投票値はコメントフィールドに保存されます。したがって、コメントを表示すると、個々のコメントの評価データが表示されます。
次に、トリッキーな部分です。 ノードにも4(または全体で5)フィールドを追加する必要があります。以前に作成した各タグの下でこれを選択します。これで、通常のノードビューで集計結果を確認できるようになります。ビューの場合は、タグを定義する必要があります。そのため、追加の全体的なタグがないと、同様に投票によってノードを最高のフードレストランでのみソートできます。
ただし、コメントフォームに全体のフィールドを非表示にして、hook_comment_presaveの他の4つの軸から全体の値を計算することもできます。私はあなたがそれを自分でできると思います。インスピレーションを得たい場合は、機能するモジュールがあります。 (ただし、クライアント用です)。