Afficher s'il y a de «nouveaux» commentaires sur une vue des termes?

7

J'ai des commentaires sur les nœuds classés par termes. Je dois montrer une vue des termes et s'il y a de nouveaux commentaires dans l'un des nœuds avec lesquels le terme est étiqueté.

Donc, si j'ai ce qui suit:

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

J'ai besoin que ma vue ressemble à ceci:

Term1  new comments!
Term2
Term3  new comments!
Term4

J'ai d'abord essayé de créer une vue des commentaires pour inclure le nouveau champ de commentaires et d'utiliser des relations pour afficher les termes. Cependant, si un terme n'a pas de nœuds ou de commentaires (Term4 dans mon exemple), j'ai besoin que le terme soit toujours affiché.

J'ai donc essayé de faire une vue des termes. J'ai ajouté les relations «Terme de taxonomie: Contenu avec terme» et le champ «Contenu: Nouveaux commentaires» qui utilise cette relation. Cela montre le nombre de nouveaux commentaires comme prévu. Cela me donne des résultats dupliqués (que je peux peut-être corriger avec des champs de regroupement) mais de manière inattendue, il masque également les termes qui n'ont pas de commentaires ou de nœuds.

Suis-je en train de procéder correctement et si oui, comment puis-je empêcher que les termes «vides» soient cachés?

MISE À JOUR J'ai mis à jour le noyau D et quelques modules qui avaient de nouvelles versions (mais pas de vues). La vue fonctionne correctement avec la relation «Configurer la relation: Terme de taxonomie: Contenu avec le terme» lorsque le champ est «Contenu: Titre (Titre)». Cependant, lorsque j'ajoute le champ "Contenu: Nouveaux commentaires", les termes qui n'ont aucun commentaire sont masqués.

MISE À JOUR Ive a essayé ce qui suit dans un champ de vues:

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

MISE À JOUR - par «nouveaux commentaires», je veux dire des commentaires que l'utilisateur connecté n'a pas lus. Il s'agit d'un champ standard dans les vues. J'ai besoin de cela plutôt que d'une date arbitraire. Désolé pour toute confusion.

Evanss
la source
Les termes sont-ils toujours masqués si la relation de vues est définie sur non requise?
David Thomas
Voici les éléments de débogage que j'examinerais si c'était moi, y répondre pourrait aider quelqu'un à répondre à cette question: 1) Les termes réapparaissent-ils en supprimant le champ Nouveaux commentaires, la relation et / ou les deux? 2) Que se passe-t-il lorsque vous utilisez le nom du terme comme champ de regroupement ou que vous ajoutez l'identifiant du terme et que vous l'utilisez comme champ de regroupement? 3) 2) Le champ de nom de terme est-il définitivement Taxonomy term: Term name et non Content: -term vocabulary-(erreur facile à faire!) 4) Voyez-vous la même chose si vous créez une nouvelle vue Termes de taxonomie à partir de zéro avec uniquement la relation, Taxonomy Term: Term Nameet Content: New Comments?
user56reinstatemonica8
avec quelle version de drupal travaillez-vous? avec quelle version des vues? travaillez-vous avec une relation pour une raison particulière? avez-vous plutôt essayé l'option "grouper par"?
pasine
@notme im utilisant les derniers drupal et modules. Comme j'ai une vue des termes, je dois utiliser une relation pour accéder au champ qui indique si les nœuds ont de nouveaux commentaires.
Evanss
1
@notme, si la vue est une liste de nœuds, encore une fois - les termes qui n'ont pas de nœuds attachés ne seraient pas disponibles, donc le même problème se poserait. jdln, pas une solution parfaite, mais que diriez-vous d'ajouter une nouvelle pièce jointe à votre vue qui n'affiche que les termes qui n'ont pas de nœuds et de joindre cet affichage sous votre vue de page normale? Cela fonctionnerait-il? Ensuite, les termes sans nœuds s'imprimeraient toujours en bas, donc le tri ne serait pas aussi facile - mais c'est peut-être une option.
Boriana Ditcheva

Réponses:

1

Cela fonctionne pour moi. J'ai une vue de terme qui affiche le champ du nom du terme et mon code ajoute le nouveau drapeau de commentaire après le nom du terme.

Le code va dans un module personnalisé.

Vous devez remplacer VIEW_NAME par le nom de votre vue et TAXONOMY_FIELD_NAME par le nom de votre champ (comme field_tags par exemple).

/**
 * 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
la source
Par «nouveaux» commentaires, je veux dire des commentaires que l'utilisateur connecté n'a pas vus. Il s'agit d'un champ standard dans les vues. Votre code l'utilise-t-il ou s'agit-il d'une valeur de date arbitraire? D'après vos commentaires de code, il semble que ce dernier?
Evanss
En plus du commentaire de @ jdln ci-dessus, la historytable contient les données des nœuds de lecture par uid.
AyeshK
Il utilisait le dernier temps d'accès de l'utilisateur, il afficherait donc des commentaires écrits depuis la dernière connexion de l'utilisateur. Pour les utilisateurs déconnectés, il utilisait une période fixe de 2 semaines. Je l'ai maintenant modifié afin qu'il ne fonctionne que pour les utilisateurs connectés et qu'il soit basé sur la dernière fois où l'utilisateur a consulté les nœuds sur lesquels les commentaires se trouvent.
rooby
0

L'ajout du champ "Contenu: Nouveaux commentaires" ajoute un INNER JOINà la table node_comment_statistics, qui peut potentiellement être la source des problèmes que vous rencontrez. (Par exemple, s'il n'y a aucune entrée pour NodeC, NodeD et NodeE dans node_comment_statistics pour une raison quelconque, les termes ne seront pas affichés car ils JOINsont un INNER.)

La reconstruction de node_comment_statistics est-elle utile?

jamix
la source
La raison pour laquelle j'obtiens les résultats supplémentaires est que j'obtiens un résultat pour chaque nœud, car chaque nœud a une valeur numérique pour le nombre de nouveaux commentaires. C'est ennuyeux que je ne puisse pas avoir de résultat pour chaque terme et une valeur oui / non s'il y a de nouveaux commentaires sur l'un des nœuds de ce terme, mais je ne pense pas que ce soit un bug, par sa conception.
Evanss
0

Voici une esquisse d'une réponse qui vous aidera à vous y rendre, je pense. Commencez par créer une vue des nœuds, puis ajoutez la taxonomie et la dernière heure de commentaire sous forme de champs.

Activez maintenant l'agrégation pour la vue et définissez l'agrégation pour le champ de taxonomie comme "regrouper les résultats", dans la colonne "tid".

Modifiez le paramètre d'agrégation pour le champ de temps de commentaire à "Maximum".

Vous devriez maintenant avoir une vue qui répertorie tous vos termes de taxonomie (au moins ceux qui ont du contenu) avec la dernière date de commentaire. La dernière étape consistera à traiter l'horodatage du commentaire dans un point de vue ou un thème pour le faire afficher comme vous le souhaitez, ce qui devrait être relativement simple.

Alfred Armstrong
la source
Comment puis-je faire la dernière étape de "Modifier le paramètre d'agrégation pour le champ de temps de commentaire à" Maximum "." ?
Evanss
Une fois que vous avez activé les paramètres d'agrégation, chaque champ de la liste sous Champs doit avoir un lien de paramètres d'agrégation à côté. Cliquez dessus et vous devriez voir un menu déroulant intitulé "type d'agrégation". Maximum est l'une des options.
Alfred Armstrong
J'ai fait cela, mais ce n'est pas en regroupant les résultats par terme de taxonomie. J'ai toujours un résultat pour chaque nœud.
Evanss
Avez-vous défini l'agrégation pour le champ de taxonomie comme "regrouper les résultats", dans la colonne "tid", selon ma réponse? J'ai testé cette méthode donc je suis assez confiant qu'elle fonctionne.
Alfred Armstrong
1
J'ai essayé cette approche lors d'une installation de test et j'ai obtenu les résultats décrits, il doit donc y avoir une différence avec ce que nous avons chacun fait. Avez-vous supprimé le champ de titre du nœud? Vous n'en avez pas besoin et cela gâchera le résultat.
Alfred Armstrong
0

Vous devez d'abord faire une autre requête, pour récupérer les termes qui ont des nœuds avec un nouveau contenu.

J'ai été aidé par ce fil .

Comme je vous l'ai dit, j'ai mis tout cela dans des champs php; si vous avez le temps, il vaudra mieux le mettre dans un module, dans un views_query_alter ou autre.

  1. Ajoutez un champ php , et dans le code de configuration , allez chercher la liste des termes qui ont du nouveau contenu:

    $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. Maintenant, dans le code de sortie , vérifiez que votre terme est dans ce tableau:

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

C'est le plus léger que je vois, même si la requête peut être lourde si vous avez une grande quantité de nœuds et de commentaires.

EDIT: Je dois rappeler que mettre php dans le sql avec des vues php n'est PAS une bonne pratique , je vous invite à mettre tout cela dans un module personnalisé dans hook_views_query_alter dès que vous le pouvez.

Gregory Kapustin
la source
J'ai peur que ça ne marche pas. Chaque terme a le champ de «nouveaux commentaires! même si seuls certains ont en fait de nouveaux commentaires sur leur contenu. La seule exception est le terme qui n'a aucun nœud.
Evans
@kiamlaluno a modifié le code. Ça marche maintenant? Ça le fait pour moi :)
Gregory Kapustin
Je n'ai pas changé le code; J'ai simplement reformaté le texte. :) Si cela ne fonctionne pas pour @jdln, mais qu'il fonctionne pour vous, alors il est possible que vous appliquiez le code différemment, ou que les termes de taxonomie proviennent de vocabulaires différents (par exemple, une taxonomie de balises).
kiamlaluno