web-dev-qa-db-ja.com

スレッド結果を維持する投票結果によってビューのコメントを並べ替える

投票結果順に並べられたノードのコメントを表示したい(リストの一番上にある最も人気のあるコメント)。 投票APIrate および views モジュールをインストールしました。次に、yes/no投票をコメントに追加し、コメントのスレッド化を有効にして、ユーザーが互いに返信できるようにします。

以下のソート基準を使用して、最も一般的な順序でコメントを表示するビューを作成しました。

Comment: Thread (asc)
SUM(Votes: Value)

ここで問題は、ビューがスレッドを維持しようとすると、テーマを投稿日(asc/disc)でソートし、2番目のソート基準が表示されないことです。

では、スレッド結果を維持したまま投票結果でコメントを並べ替えるにはどうすればよいですか?

編集: views config

7
shekoufeh

主な問題

現在、すべての子供と孫のコメントをメインの親(元の/初めての親)に関連付ける方法はありません。また、メインの親をすべての子から分離する方法が必要です。

TL、DRソリューション

ビューフィールドビューモジュールを使用して、子をメインの親から分離し、すべての子をフィールドとして追加します。このようにして、子供や孫に影響を与えることなく、主要な親を投票で並べ替えることができます。

ただし、メインの親CIDのすべての子と孫を表示する方法はありません。したがって、この問題を解決するカスタムモジュールを作成して、フィールドテクニックを使用できるようにします。

詳細なソリューション

要件

ビューフィールドビューエンティティAPI 、メインPID(以下のカスタムモジュール)。


main_pid.info

name = Main PID
description = Links all children and grandchildren comments to the main parent by saving main parent cid into main_parent_pid field when comment is saved.
package = custom
core = 7.x

main_pid.module

<?php

/**
 * Implements hook_comment_presave()
 */ 
function main_pid_comment_presave($comment) {

  $pid = $comment->pid;

  if ($pid > 0){

    while ($pid > 0) {
      // Implements comment_load()
      $load_comment = comment_load($pid);

      $pid = $load_comment->pid;
      $cid = $load_comment->cid;

    }

    $comment->field_main_pid[LANGUAGE_NONE][0]['value'] = $cid;

  }

  elseif ($pid == 0) {

    $comment->field_main_pid[LANGUAGE_NONE][0]['value'] = 0;

  }

}

コメントに、マシン名がfield_main_pidのMain PIDという新しいフィールドを追加します。これはプログラムで、またはDrupal UIを使用して行うことができます(これはあなたにお任せします)

enter image description here

次に、フィールドを表示しないようにします

enter image description here


あなたの見解:

フィールドにComment: Rendered Commentを追加します(Entity APIに感謝)

enter image description here

フィールドにComment IDを追加します

enter image description here


新しいブロックを追加します

enter image description here

ブロックをクリックして、表示名を変更します

enter image description here

フィールドにDepthを追加します

enter image description here

フィールドにComment: Rendered Commentを追加します(Entity APIに感謝)

enter image description here

スタイル設定では、CSSを使用して子をインデントできます。

例:

.depth-1 { width: 480px; margin-left: 10px; }
.depth-2 { width: 470px; margin-left: 20px; }

フィルター基準で、Content: Main PIDを追加します

enter image description here

メインの親のみPIDが0であるため、すべての子のみが表示されます

次に、Content: Threadをソートに追加し、Main PIDをコンテキストフィルターに追加します

したがって、Children Viewは次のようになります。

enter image description here


最初のビューに戻る

フィルター基準にメインPIDを追加します

enter image description here

今回はメインの親だけが必要なので、0に等しくなります。

次に、フィールドにGlobal: Viewを追加します(ビューフィールドのおかげでビュー)

enter image description here

あなたのオリジナル/メインビューは次のようになります:

重要:NIDのコンテキストフィルターをここに追加します(これを行うのを忘れていました)。

enter image description here

最後に、並べ替え基準でVotes Valueを追加し(私は投票APIとレートをインストールする必要がなかったため、スクリーンショットには表示されていません)、デフォルトのPost dateを削除します。

2
No Sssweat