用語のビューに「新しい」コメントがあるかどうかを示しますか?


7

用語で分類されたノードについてコメントがあります。用語のビューと、その用語がタグ付けされているノードのいずれかに新しいコメントがあるかどうかを表示する必要があります。

だから私が以下を持っているなら:

Term1
-NodeA (has new comments)
-NodeB (has new comments) 
Term2
-NodeC (no new comments) 
-NodeD (no new comments) 
Term3
-NodeE (no new comments) 
-NodeF (has new comments)
Term4

私の見解は次のようにする必要があります:

Term1  new comments!
Term2
Term3  new comments!
Term4

最初に、コメントを表示して新しいコメントフィールドを含め、関係を使用して用語を表示してみました。ただし、用語にノードやコメントがない場合(この例ではTerm4)、用語を引き続き表示する必要があります。

それで私はそれから用語の見方を試みました。「分類用語:用語を含むコンテンツ」という関係と、この関係を使用する「コンテンツ:新しいコメント」というフィールドを追加しました。これは、期待どおりに新しいコメントの数を示しています。重複した結果(グループ化フィールドで修正できる場合があります)が表示されますが、予期せず、コメントやノードがない用語も非表示になります。

私はこれを正しい方法で行っていますか?そうであれば、「空の」用語が非表示になるのをどのように防ぐことができますか?

更新Dコアと、新しいバージョン(ビューは含まない)を備えたいくつかのモジュールを更新しました。フィールドが「コンテンツ:タイトル(タイトル)」の場合、ビューは「関係の構成:分類用語:用語のコンテンツ」の関係で正常に機能します。ただし、[コンテンツ:新しいコメント]フィールドを追加すると、コメントのない用語が非表示になります。

UPDATE Iveはビューフィールドで次のことを試みました。

if(intval($data->node_new_comments) > 0) {
  if(!array_key_exists($data->tid, $static)) {
    print "new comments !";
    $static[$data->tid] = 1;
  }
} else {
  print "here you do whatever you want when there's no new comment";
}

更新-「新しいコメント」とは、ログインしたユーザーが読んだことのないコメントを意味します。これはビューの標準フィールドです。私は、任意の日付を切り捨てるのではなく、これが必要です。混乱してすみません。


ビューの関係に設定されている場合に関しては、まだ隠されているではない必要?
David Thomas

これが私であった場合に調査するデバッグの項目です。これらに回答すると、誰かがこれに答えるのに役立つ場合があります。2)用語名をグループ化フィールドとして使用したり、用語IDを追加してグループ化フィールドとして使用したりするとどうなりますか?3)2)用語名フィールドです間違い Taxonomy term: Term nameなくContent: -term vocabulary-)(作るための簡単な間違い!)4新しい分類の利用規約を作成する場合は、同じものを参照していて、最初から見るだけの関係、Taxonomy Term: Term NameおよびContent: New Comments
user56reinstatemonica8 2013年

どのバージョンのdrupalを使用していますか?どのバージョンのビューで?特定の理由で関係を築いていますか?代わりに「グループ化」オプションを試しましたか?
pasine 2013年

@notme imは最新のdrupalとモジュールを使用しています。用語のビューがあるので、ノードに新しいコメントがあるかどうかを示すフィールドにアクセスするには、関係を使用する必要があります。
Evanss 2013年

1
@notme、ビューがノードのリストの場合も、ノードがアタッチされていない用語は使用できないため、同じ問題が発生します。jdlnは完全なソリューションではありませんが、ノードのない用語のみを表示する新しい添付ファイルをビューに追加して、通常のページビューの下にその表示を添付することはどうでしょうか。それはうまくいくでしょうか?次に、ノードのない用語は常に下部に出力されるため、並べ替えはそれほど簡単ではありません-おそらくそれはオプションです。
Boriana Ditcheva 2013年

回答:


1

これでうまくいきます。用語名フィールドを表示する用語ビューがあり、コードでは用語名の後に新しいコメントフラグを追加します。

コードはカスタムモジュールに入れます。

VIEW_NAMEをビュー名に、TAXONOMY_FIELD_NAMEをフィールド名(field_tagsなど)に変更する必要があります。

/**
 * Implements hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view) {
  global $user;
  if ($view->name == 'VIEW_NAME' && $user->uid) {
    // Get all the tids of the views results.
    $tids = array();
    foreach ($view->result as $result) {
      $tids[] = $result->tid;
    }

    // Get all the tids that have recent comments.
    // Only return terms that relate to nodes that have not been viewed by
    // the current user since the last comment.
    $query = db_query("SELECT t.TAXONOMY_FIELD_NAME_tid
                         FROM {node_comment_statistics} c
              LEFT OUTER JOIN {history} h ON c.nid = h.nid AND h.uid = :uid
                   INNER JOIN {field_data_TAXONOMY_FIELD_NAME} t ON t.entity_id = c.nid
                        WHERE c.comment_count > 0
                          AND t.TAXONOMY_FIELD_NAME_tid IN (:tids)
                          AND (h.timestamp IS NULL OR h.timestamp < c.last_comment_timestamp)",
               array(':uid' => $user->uid, ':tids' => $tids));
    $commented_terms = $query->fetchCol();

    // Loop through the results and add the new comments flag where necessary.
    foreach ($view->result as &$result) {
      if (in_array($result->tid, $commented_terms)) {
        $result->taxonomy_term_data_name .= ' new comments!';
      }
    }
  }
}

「新しい」コメントとは、ログインしたユーザーが見たことのないコメントを意味します。これはビューの標準フィールドです。あなたのコードはこれを使用していますか、それとも任意の日付値ですか?あなたのコードコメントから、それは後者のようですか?
エヴァンス2013

上記の@jdlnのコメントに加えて、historyテーブルにはuidによる読み取りノードのデータが含まれています。
AyeshK 2013

ユーザーの最終アクセス時刻を使用していたため、ユーザーが最後にログオンしてから書き込まれたコメントが表示されます。ログアウトしたユーザーは、2週間の固定期間を使用していました。これを変更して、ログインしたユーザーに対してのみ機能するようにしました。これは、ユーザーが最後にコメントが表示されたノードをいつ表示したかに基づいています。
rooby

0

[コンテンツ:新しいコメント]フィールドを追加するINNER JOINと、node_comment_statisticsテーブルにが追加され、発生している問題の原因となる可能性があります。(たとえば、何らかの理由でnode_comment_statisticsにNodeC、NodeD、NodeEのエントリがない場合、用語は1 JOINであるため表示されませんINNER。)

node_comment_statisticsの再建支援を?


追加の結果を取得する理由は、各ノードに新しいコメントの数の数値があるため、各ノードの結果を取得するためです。各用語の結果と、その用語のノードのいずれかに新しいコメントがある場合のyes / no値を取得できないのは不愉快ですが、これはバグであるとは考えていません。これは設計によるものです。
エヴァンス2013

0

ここにあなたがそこまでの道のりのほとんどを理解するであろう答えのスケッチがあると思います。ノードのビューを作成することから始めて、分類法と最新のコメント時刻をフィールドとして追加します。

次に、ビューの集計をオンにし、「tid」列で、分類フィールドの集計を「group results一緒」に設定します。

コメント時間フィールドの集計設定を「最大」に変更します。

これで、すべての分類用語(少なくともコンテンツを含むもの)を最後のコメント日付とともにリストするビューが表示されます。最後のステップは、ビューのフックまたはテーマでコメントのタイムスタンプを処理して、必要に応じて表示することです。これは比較的簡単です。


「コメント時間フィールドの集計設定を「最大」に変更する」の最後の手順を実行するにはどうすればよいですか。?
エヴァンス2013

集計設定をオンにすると、[フィールド]の下のリストのすべてのフィールドの横に集計設定リンクが表示されます。それをクリックすると、「集約タイプ」というラベルの付いたプルダウンが表示されます。最大値はオプションの1つです。
アルフレッドアームストロング

Iveはこれを行いましたが、結果を分類用語ごとにグループ化していません。各ノードの結果はまだ残っています。
エヴァンス2013

私の回答に従って、分類フィールドの集計を「tid」列で「グループ結果を一緒に」に設定しましたか?私はこの方法をテストしたので、うまくいくと確信しています。
アルフレッドアームストロング

1
私はこの方法をテストインストールで試して、説明どおりの結果を得たので、それぞれが行ったことと多少の違いがあるはずです。ノードタイトルフィールドを削除しましたか?あなたはそれを必要とせず、それは結果を台無しにするでしょう。
アルフレッドアームストロング

0

新しい内容のノードを持つ用語を取得するには、最初に別のクエリを実行する必要があります。

このスレッドに助けられました。

お伝えしたように、これはすべてphpフィールドに入れました。時間があれば、モジュール、views_query_alterなどに配置することをお勧めします。

  1. phpフィールドを追加し、セットアップコードで、新しい内容の用語のTIDのリストを取得します。

    $query = db_select('node_comment_statistics', 'c')
      ->condition('c.last_comment_timestamp', 'history_user.timestamp', '>');
    $query->join('field_data_YOURTERMREFERENCEFIELD', 't', 't.entity_id=c.nid');
    $query->fields('t', array('YOURTERMREFERENCEFIELD_tid'))
      ->groupBy('t.YOURTERMREFERENCEFIELD_tid');
    
    $static = $query->execute()->fetchCol();
    
  2. 次に、出力コードで、用語がこの配列にあることを確認します。

    if (in_array($data->tid, $static)) {
      print 'new comments !';
    }
    

これは、大量のノードとコメントがある場合にクエリが重くなる場合でも、私が見る最も軽いものです。

編集:ビュー付きのphpをsqlに配置することはお勧めできませんphpは、できるだけ早くhook_views_query_alterのカスタムモジュールに配置することをお勧めします。


私はそれが機能していないことを恐れています。すべての用語に「新しいコメント!」というフィールドがあります。一部の人だけが実際にそのコンテンツに新しいコメントを持っています 唯一の例外は、ノードがまったくないという用語です。
エヴァンス2013

@kiamlalunoがコードを編集しました。今は動作しますか?それは私のために:)
グレゴリー・カプスティン2013

コードは変更しませんでした。私は単にテキストを再フォーマットしました。:)それが@jdlnでは機能しないが、あなたにとっては機能する場合、コードを異なる方法で適用している、または分類用語が異なる語彙からのものである可能性があります(例:タグ分類)。
kiamlaluno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.