web-dev-qa-db-ja.com

ネストと親の関係を持つコメントのビューブロックを作成する方法

Drupalsのデフォルトのコメントのレンダリングを使用するのではなく、ノードのコメントをビューに表示しようとしています。

すべてのコメント(返信を含む)をトップレベルのコメントとしてレンダリングするのではなく、コメントを返信とともにレンダリングするノードにコメントビューを表示することは可能ですか?

これを行うにはどのようにビューを設定しますか?

[〜#〜]更新[〜#〜]

ビューを正しく設定し、コメントと返信が正しい順序で表示されるようにしました。

設定する必要があります:

_Relationship -> Comment: Parent Comment
Sort Criteria -> Thread (desc)
Sort Criteria -> (Parent Comment) Comment: Post date (asc)
_

ただし、ページャーはまだすべてのコメントの返信を1つのアイテムとしてカウントするため、途中でスレッドが途切れがちであり、理想的にはページングしたいと思います。

元の動作

これまでに試みたこと-表示:設定:親の関係

トップレベルのコメントを取得するのはかなり簡単でした。コメントを表示するビューブロックを作成して追加しました。

Contextual filter -> Comment NID (Content ID from URL)(表示 ここ

これにより、コメントを表示するビューブロックが表示されます。ただし、すべてのコメントはトップレベルのコメントとして表示されます(インデントされたマークアップはありません)

親の関係が必要だったので、2つ目の関係を追加しました(コメントビューにはデフォルトで_Comment: Content_の関係があります)。

_Comment: Parent Comment
_

enter image description here

そして、フォーマット:表示:設定で、以下を有効にしました:

_Relationship: Parent Comment
_

残念ながら、ノードのロード時に、これによりいくつかのPHPエラーが発生します。views_plugin_row_comment_view.incにはpre_render関数があり、何らかの理由で関係を変更します。親コメントにより、CIDがプリレンダーにロードされません。機能しているため、以下に表示されるすべての恐ろしいエラーが出力されます。

_Undefined property: stdClass::$cid in views_plugin_row_comment_view->pre_render() (line 79 of ... sites\all\modules\views\modules\comment\views_plugin_row_comment_view.inc
Warning: array_flip(): Can only flip STRING and INTEGER values! in DrupalDefaultEntityController->load() (line 173 of C:\xampp\htdocs\basic\includes\entity.inc).
Notice: Undefined index: in template_preprocess_views_view_row_comment() (line 645 of C:\xampp\htdocs\basic\sites\all\modules\views\modules\comment.views.inc).
Notice: Trying to get property of non-object in template_preprocess_views_view_row_comment() (line 646 of C:\xampp\htdocs\basic\sites\all\modules\views\modules\comment.views.inc).
Notice: Undefined index: in template_preprocess_views_view_row_comment() (line 646 of C:\xampp\htdocs\basic\sites\all\modules\views\modules\comment.views.inc).
Notice: Trying to get property of non-object in template_preprocess_views_view_row_comment() (line 650 of C:\xampp\htdocs\basic\sites\all\modules\views\modules\comment.views.inc).
EntityMalformedException: Missing bundle property on entity of type comment. in entity_extract_ids() (line 7729 of C:\xampp\htdocs\basic\includes\common.inc).
_

これまでに試みたこと-ソート:コメントスレッド

私は次の sandbox モジュールを見て、問題のスレッドによると、それは https://drupal.org/node/1039494 に基づいていました、明らかに時代は解決されました前に並べ替え基準_Comment: Thread_を追加しました。

これを追加して親コメントに関係を設定しようとしましたが、これも効果がなく、コメントは別の行に残りました。誰かがこの方法で成功しましたか?

3
Dominic Woodman

指定した数のネストレベル(例:2)しかない場合、アタッチされたビューを使用しようとします。

すべての関係は、親のコメントから子のコメントまでであり、その逆ではありません。

また、関係が不要であることを確認してください(子コメントを持たないコメントが除外されないようにするために、INNER JOINSではなくOUTER JOINSが必要です)。

したがって、トップレベルのビューはトップコメントのみをフェッチします。次に、アタッチされたビューは、親コメントなどの子コメントをフェッチします。

このソリューションには最適なパフォーマンスがなく、深い入れ子に対応できません。ただし、カスタムコーディングは必要ありません。

カスタムコーディングを行う場合は、ビューPHPフィールドを追加し、次のようなものを使用してください https://api.drupal.org/api/drupal/modules%21comment% 21comment.module/function/comment_get_thread/7

スレッド内のすべてのコメントを取得する

1
Nikos Tsagkas

Views Threaded Comments サンドボックスモジュールをインストールすることをお勧めします。

スレッド化されたコメントビュープラグインを提供します

私は開発者なので、そこから始めます。開発者でない場合は、サンドボックスプロジェクトを出発点として適切に見つけられない可能性があります。

2
tenken

わかりましたので、ここが私の最終的な解決策でした。ポケットベルの問題を解決できなかったため、代わりに次のデザインを使用しました。

  • 最上位のコメントがフィールドのみのビューのノードに表示されます
  • それぞれには、別のページの個別のビューであるコメントディスカッションへのリンクがあります。
  • 個別のコメントビューでは、フィールドではなくコメントが表示されます

トップレベルのコメントビューは設定がかなり簡単です。わずかに混乱する部分は、トップレベルのコメントのみを表示するフィルターです。必要なもの:

  • 関係:コメント:親コメント
  • フィルター:コメントID-関係(親コメント)-値= NULL

コメントディスカッションへのリンクを生成するには、別のモジュールが必要です。問題は、正しいコメントを取得する方法と、データベースからのすべての返信です。コメントはPIDを格納しますが、チェーン内では、チェーン全体を見つけるために再帰的に検索する必要があります。代わりに、自然にロードされないスレッドフィールドを使用する必要があります。

スレッドフィールドには、次の値が含まれます。

Comment   - 01
  Reply   - 01.01
    Reply - 01.01.01
    Reply - 01.01.02
Comment   - 02

したがって、チェーン全体を取得するために必要なのは、コメントが存在するノードのスレッドとnidの最初の2桁だけです。

スレッドを追加するには、hook_views_query_alterを使用して、メインページで使用しているコメントビューを変更します。モジュールの設定方法の良い説明は here です。

必要な正確なクエリは次のとおりです。

  if ($view->name == 'my_comment_view') {
    $query->fields['thread'] = array (
      'field' => 'thread',
      'table' => 'comment',
      'alias' => 'comment_thread',
    );
  }

次に、2つのワイルドカードを含むパスを使用してコメントディスカッションビューを作成する必要があります。

次に、ビューテンプレートでURLを生成するとき、1つはコメントが存在するノードのIDである必要があり、もう1つはスレッドの最初の2桁です。

コメントディスカッションビューには、コンテキストフィルターが必要です。

  • コンテキストフィルター:コメント:NID

また、UIでこれを行うことはできないため、hook_views_query_alter alterを使用して正しいスレッドを選択するようにクエリを変更する必要があります。

if ($view->name == 'comment_discussion_page' && $view->current_display == 'page') {
    $thread_id = $view->args(1); 
    //check argument is an integer before putting it in a query
    if((is_numeric($thread_id) && $thread_id >= 1 && $thread_id == round($thread_id))) {
      $query->add_where(1, 'thread', $thread_id.'%', 'LIKE');
    } else {
      drupal_set_message(t('Whoops something has gone wrong. Go back and try reloading this page.'), 'error');
    }  
}

おめでとうございます。コメントシステムが完全に機能しています。

実際、私は2つの部分を忘れました。1つはインデントされたクラスを追加するために、次のコードをtemplate_preprocess_commentに追加しました。

    $vars['count_fullstop'] = substr_count($vars['elements']['#comment']->thread, '.');
    if($vars['count_fullstop'] > 0 && $vars['count_fullstop'] < 4) {
      $vars['classes_array'][] = 'indented_'.$vars['count_fullstop'];
    } elseif($vars['count_fullstop'] >= 4){
      $vars['classes_array'][] = 'indented_3';
    }

ページングの問題を回避するために、スレッド全体を単一のページに表示します。私は巨大なスレッドを期待しておらず、パフォーマンスの問題の可能性をあまり価値のないページにオフロードしているので、これは気になりません。

(付記。従来のコメントシステムではなくビューを使用している唯一の理由は、特定のノードで複数のノードからコメントを集約する必要があり、それらをフィルターできるようにする必要があることです。そうでない場合は、通常のシステム!)

0
Dominic Woodman