Zeigen Sie, ob es "neue" Kommentare zu einer Ansicht von Begriffen gibt?

7

Ich habe Kommentare zu Knoten, die nach Begriffen kategorisiert sind. Ich muss eine Ansicht der Begriffe anzeigen und wenn in einem der Knoten, mit denen dieser Begriff gekennzeichnet ist, neue Kommentare vorhanden sind.

Also, wenn ich folgendes habe:

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

Ich brauche meine Ansicht, um so auszusehen:

Term1  new comments!
Term2
Term3  new comments!
Term4

Zuerst habe ich versucht, Kommentare anzuzeigen, um das neue Kommentarfeld einzuschließen, und Beziehungen zu verwenden, um die Begriffe anzuzeigen. Wenn ein Begriff jedoch keine Knoten oder Kommentare enthält (in meinem Beispiel Term4), muss der Begriff weiterhin angezeigt werden.

Also habe ich dann versucht, mir die Begriffe anzusehen. Ich habe die Beziehungen 'Taxonomiebegriff: Inhalt mit Begriff' und das Feld 'Inhalt: Neue Kommentare' hinzugefügt, das diese Beziehung verwendet. Dies zeigt die Anzahl der neuen Kommentare wie erwartet an. Es gibt mir doppelte Ergebnisse (die ich möglicherweise mit Gruppierungsfeldern korrigieren kann), aber unerwartet werden auch die Begriffe ausgeblendet, die keine Kommentare oder Knoten enthalten.

Gehe ich das richtig an und wenn ja, wie kann ich verhindern, dass die "leeren" Begriffe versteckt werden?

UPDATE Ich habe den D-Core und einige Module mit neuen Versionen (aber nicht mit Ansichten) aktualisiert. Die Ansicht funktioniert gut mit der Beziehung "Beziehung konfigurieren: Taxonomiebegriff: Inhalt mit Begriff", wenn das Feld "Inhalt: Titel (Titel)" lautet. Wenn ich jedoch das Feld "Inhalt: Neue Kommentare" hinzufüge, werden Begriffe ohne Kommentare ausgeblendet.

UPDATE Ich habe Folgendes in einem Ansichtsfeld versucht:

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";
}

UPDATE - Mit "neuen Kommentaren" meine ich Kommentare, die der angemeldete Benutzer nicht gelesen hat. Dies ist ein Standardfeld in Ansichten. Ich brauche dies eher als einen willkürlichen Stichtag. Entschuldigen Sie die Verwirrung.

Evanss
quelle
Sind die Begriffe immer noch ausgeblendet, wenn die Ansichtsbeziehung nicht erforderlich ist?
David Thomas
Hier sind die Debugging-Dinge, die ich untersuchen würde, wenn ich es wäre. Wenn ich diese beantworte, kann dies jemandem helfen, dies zu beantworten: 1) Werden die Begriffe beim Entfernen des Felds "Neue Kommentare", der Beziehung und / oder beider erneut angezeigt? 2) Was passiert, wenn Sie den Termnamen als Gruppierungsfeld verwenden oder die Term-ID hinzufügen und als Gruppierungsfeld verwenden? 3) 2) Ist der Begriff Namensfeld auf jeden Fall Taxonomy term: Term name und nicht Content: -term vocabulary-(leicht Fehler zu machen!) 4) Haben Sie die gleiche Sache sehen , ob Sie eine neue Taxonomie Bedingungen sehen von Grund auf mit erstellen nur die Beziehung, Taxonomy Term: Term Nameund Content: New Comments?
user56reinstatemonica8
Mit welcher Drupal-Version arbeiten Sie? mit welcher Version von Ansichten? Arbeiten Sie aus einem bestimmten Grund mit einer Beziehung? Haben Sie stattdessen die Option "Gruppieren nach" ausprobiert?
Pasine
@notme Ich benutze die neuesten Drupal und Module. Da ich eine Ansicht von Begriffen habe, muss ich eine Beziehung verwenden, um zu dem Feld zu gelangen, das anzeigt, ob die Knoten neue Kommentare haben.
Evanss
1
@notme, wenn die Ansicht eine Liste von Knoten ist, dann wieder - Begriffe, an die keine Knoten angehängt sind, wären nicht verfügbar, sodass das gleiche Problem bestehen würde. jdln, keine perfekte Lösung, aber wie wäre es, wenn Sie Ihrer Ansicht einen neuen Anhang hinzufügen, in dem nur Begriffe ohne Knoten angezeigt werden, und diese Anzeige unter Ihrer regulären Seitenansicht anhängen? Funktioniert das? Dann werden die Begriffe ohne Knoten immer unten ausgedruckt, sodass das Sortieren nicht so einfach ist - aber vielleicht ist es eine Option.
Boriana Ditcheva

Antworten:

1

Das funktioniert bei mir. Ich habe eine Termansicht, in der das Feld für den Termnamen angezeigt wird, und mein Code fügt das neue Kommentarflag nach dem Termnamen hinzu.

Der Code wird in einem benutzerdefinierten Modul gespeichert.

Sie müssen zu VIEW_NAME zu Ihrem Ansichtsnamen und zu TAXONOMY_FIELD_NAME zu dem Namen Ihres Felds wechseln (wie z. B. 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!';
      }
    }
  }
}
Rooby
quelle
Mit "neuen" Kommentaren meine ich Kommentare, die der angemeldete Benutzer nicht gesehen hat. Dies ist ein Standardfeld in Ansichten. Verwendet Ihr Code dies oder ist es ein beliebiger Datumswert? Aus Ihren Codekommentaren geht hervor, dass Letzteres?
Evanss
Zusätzlich zu dem obigen Kommentar von @ jdln historyenthält die Tabelle Daten von Leseknoten nach UID.
AyeshK
Es wurde die letzte Zugriffszeit des Benutzers verwendet, sodass Kommentare angezeigt wurden, die seit der letzten Anmeldung des Benutzers geschrieben wurden. Für abgemeldete Benutzer wurde ein fester Zeitraum von 2 Wochen verwendet. Ich habe es jetzt so geändert, dass es nur für angemeldete Benutzer funktioniert und darauf basiert, wann der Benutzer die Knoten, auf denen sich die Kommentare befinden, zuletzt angezeigt hat.
Rooby
0

Durch Hinzufügen des Felds "Inhalt: Neue Kommentare" wird INNER JOINder Tabelle "node_comment_statistics" eine hinzugefügt, die möglicherweise die Ursache für die aufgetretenen Probleme sein kann. (Zum Beispiel, wenn es keine Einträge ist für KnotenC, NodeD und Nodee in node_comment_statistics aus irgendeinem Grunde werden die Begriffe nicht auf die gezeigt werden , JOINein Wesen INNERein.)

Hilft die Neuerstellung von node_comment_statistics ?

Jamix
quelle
Der Grund, warum ich die zusätzlichen Ergebnisse erhalte, ist, dass ich für jeden Knoten ein Ergebnis erhalte, da jeder Knoten einen Zahlenwert für die Anzahl der neuen Kommentare hat. Es ist ärgerlich, dass ich nicht einfach ein Ergebnis für jeden Begriff und einen Ja / Nein-Wert haben kann, wenn es neue Kommentare zu einem der Knoten für diesen Begriff gibt, aber ich denke nicht, dass dies ein Fehler ist, es ist beabsichtigt.
Evanss
0

Hier ist eine Skizze einer Antwort, die Sie den größten Teil des Weges dorthin bringt, denke ich. Erstellen Sie zunächst eine Ansicht der Knoten und fügen Sie dann die Taxonomie und die letzte Kommentarzeit als Felder hinzu.

Aktivieren Sie nun die Aggregation für die Ansicht und setzen Sie die Aggregation für das Taxonomiefeld in der Spalte "tid" auf "Gruppenergebnisse zusammen".

Ändern Sie die Aggregationseinstellung für das Kommentarzeitfeld auf "Maximum".

Sie sollten jetzt eine Ansicht haben, in der alle Taxonomiebegriffe (zumindest diejenigen mit Inhalt) mit dem Datum des letzten Kommentars aufgelistet sind. Der letzte Schritt besteht darin, den Kommentar-Zeitstempel in einem Ansichts-Hook oder Theming zu verarbeiten, damit er nach Bedarf angezeigt wird. Dies sollte relativ einfach sein.

Alfred Armstrong
quelle
Wie mache ich den letzten Schritt von 'Ändern Sie die Aggregationseinstellung für das Kommentarzeitfeld auf "Maximum".' ?
Evanss
Sobald Sie die Aggregationseinstellungen aktiviert haben, sollte neben jedem Feld in der Liste unter Felder ein Link mit den Aggregationseinstellungen angezeigt werden. Klicken Sie darauf und Sie sollten ein Pulldown mit der Bezeichnung "Aggregationstyp" sehen. Maximum ist eine der Optionen.
Alfred Armstrong
Ich habe dies getan, aber es gruppiert die Ergebnisse nicht nach Taxonomiebegriff. Ich habe immer noch ein Ergebnis für jeden Knoten.
Evanss
Haben Sie die Aggregation für das Taxonomiefeld gemäß meiner Antwort in der Spalte "tid" auf "Gruppenergebnisse zusammen" gesetzt? Ich habe diese Methode getestet und bin mir ziemlich sicher, dass sie funktioniert.
Alfred Armstrong
1
Ich habe diesen Ansatz bei einer Testinstallation ausprobiert und die Ergebnisse wie beschrieben erhalten, sodass es einen Unterschied zu dem geben muss, was wir jeweils getan haben. Haben Sie das Knotentitelfeld entfernt? Sie brauchen es nicht und es wird das Ergebnis durcheinander bringen.
Alfred Armstrong
0

Sie müssen zuerst eine weitere Abfrage durchführen, um die Begriffe mit Knoten mit neuem Inhalt abzurufen.

Dieser Thread hat mir geholfen .

Wie ich dir sagte, habe ich das alles in PHP-Felder geschrieben; Wenn Sie Zeit haben, ist es besser, sie in ein Modul, in einen views_query_alter oder sonst zu setzen.

  1. Fügen Sie ein PHP-Feld hinzu und rufen Sie im Setup-Code die Liste der Begriffe mit neuem Inhalt auf:

    $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. Überprüfen Sie nun im Ausgabecode , ob sich Ihr Begriff in diesem Array befindet:

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

Dies ist das leichteste, das ich sehe, selbst wenn die Abfrage schwer sein kann, wenn Sie eine große Anzahl von Knoten und Kommentaren haben.

EDIT: Ich muss daran erinnern, dass das Einfügen von PHP in SQL mit Ansichten PHP keine gute Praxis ist. Ich lade Sie ein, all das so schnell wie möglich in ein benutzerdefiniertes Modul in hook_views_query_alter zu setzen.

Gregory Kapustin
quelle
Ich fürchte, es funktioniert nicht. Jeder Begriff hat das Feld "Neue Kommentare!" obwohl nur einige tatsächlich neue Kommentare zu ihrem Inhalt haben. Die einzige Ausnahme ist der Begriff, der überhaupt keine Knoten hat.
Evanss
@kiamlaluno hat den Code bearbeitet. Funktioniert es jetzt ? Es tut für mich :)
Gregory Kapustin
Ich habe den Code nicht geändert. Ich habe den Text einfach neu formatiert. :) Wenn es für @jdln nicht funktioniert, aber für Sie, dann wenden Sie den Code möglicherweise anders an oder die Taxonomiebegriffe stammen aus verschiedenen Vokabularen (z. B. einer Tag-Taxonomie).
Kiamlaluno