¿Mostrar si hay comentarios 'nuevos' en una vista de términos?

7

Tengo comentarios sobre los nodos que se clasifican por términos. Necesito mostrar una vista de los términos y, si hay algún comentario nuevo en alguno de los nodos, ese término está etiquetado.

Entonces, si tengo lo siguiente:

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

Necesito que mi vista se vea así:

Term1  new comments!
Term2
Term3  new comments!
Term4

Primero intenté hacer una vista de comentarios para incluir el nuevo campo de comentarios y usar relaciones para mostrar los términos. Sin embargo, si un término no tiene nodos o comentarios (Término 4 en mi ejemplo), necesito que el término se siga mostrando.

Entonces intenté hacer una vista de los términos. Agregué las relaciones 'Término de taxonomía: contenido con término' y el campo 'Contenido: nuevos comentarios' que utiliza esta relación. Esto muestra el número de nuevos comentarios como se esperaba. Me da resultados duplicados (que puedo corregir con campos de agrupación) pero inesperadamente también oculta los términos que no tienen comentarios o nodos.

¿Voy por esto de la manera correcta y, si es así, cómo puedo evitar que se oculten los términos 'vacíos'?

ACTUALIZACIÓN He actualizado D core y algunos módulos que tenían nuevas versiones (pero no vistas). La vista funciona bien con la relación de 'Configurar relación: Término de taxonomía: Contenido con término' cuando el campo es 'Contenido: Título (Título)'. Sin embargo, cuando agrego el campo 'Contenido: nuevos comentarios', los términos que no tienen comentarios se ocultan.

ACTUALIZACIÓN He intentado lo siguiente en un campo de vistas:

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

ACTUALIZACIÓN: por "nuevos comentarios" me refiero a los comentarios que el usuario conectado no ha leído. Este es un campo estándar en vistas. Necesito esto en lugar de una fecha arbitraria cortada. Perdón por cualquier confusión.

Evanss
fuente
¿Siguen ocultos los términos si la relación de vistas está configurada como no requerida?
David Thomas
Aquí están las cosas de depuración que consideraría si fuera yo, responderlas puede ayudar a alguien a responder esto: 1) ¿Vuelven a aparecer los términos al eliminar el campo de Nuevos Comentarios, la relación y / o ambos? 2) ¿Qué sucede cuando usa el Nombre de término como un campo de agrupación, o agrega ID de término y lo usa como un campo de agrupación? 3) 2) ¿Es el campo del nombre del término definitivamente Taxonomy term: Term name y no Content: -term vocabulary-(es un error fácil de hacer!) 4) ¿Ve lo mismo si crea una nueva vista de Términos de taxonomía desde cero con solo la relación Taxonomy Term: Term Namey Content: New Comments?
user56reinstatemonica8
¿Con qué versión de Drupal estás trabajando? con que versión de vistas? ¿Estás trabajando con una relación por una razón en particular? ¿Intentaste la opción "Agrupar por"?
pasine
@notme estoy usando los últimos drupal y módulos. Como tengo una visión de los términos, necesito usar una relación para llegar al campo que muestra si los nodos tienen nuevos comentarios.
Evanss
1
@notme, si la vista es una lista de nodos, nuevamente, los términos que no tienen nodos conectados no estarán disponibles, por lo que el mismo problema se mantendría. jdln, no es una solución perfecta, pero ¿qué tal si agrega un nuevo archivo adjunto a su vista que solo muestra términos que no tienen nodos y adjunta esa pantalla bajo su vista de página normal? Funcionaría eso? Luego, los términos sin nodos siempre se imprimirían en la parte inferior, por lo que la clasificación no sería tan fácil, pero tal vez sea una opción.
Boriana Ditcheva

Respuestas:

1

Esto funciona para mi. Tengo una vista de término que muestra el campo de nombre del término y mi código agrega la nueva marca de comentario después del nombre del término.

El código va en un módulo personalizado.

Debe cambiar a VIEW_NAME a su nombre de vista y TAXONOMY_FIELD_NAME al nombre de su campo (como field_tags, por ejemplo).

/**
 * 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!';
      }
    }
  }
}
robo
fuente
Por "nuevos" comentarios me refiero a los comentarios que el usuario conectado no ha visto. Este es un campo estándar en vistas. ¿Su código usa esto o es un valor de fecha arbitrario? ¿De los comentarios de su código parece que este último?
Evanss
Además del comentario de @ jdln anterior, la historytabla contiene datos de nodos leídos por uid.
AyeshK
Estaba usando el último tiempo de acceso del usuario, por lo que mostraría los comentarios escritos desde la última vez que el usuario inició sesión. Para los usuarios desconectados, utilizaba un período fijo de 2 semanas. Ahora lo he cambiado para que funcione solo para usuarios registrados y se base en la última vez que el usuario vio los nodos en los que están los comentarios.
rooby
0

Al agregar el campo 'Contenido: nuevos comentarios' se agrega un elemento INNER JOINa la tabla node_comment_statistics, que potencialmente puede ser la fuente de los problemas que está experimentando. (Por ejemplo, si por alguna razón no hay entradas para NodeC, NodeD y NodeE en node_comment_statistics, los términos no se mostrarán debido a que JOINson INNERuno).

¿ Ayuda la reconstrucción de node_comment_statistics ?

jamix
fuente
La razón por la que obtengo los resultados adicionales es que obtengo un resultado para cada nodo, ya que cada nodo tiene un valor numérico para la cantidad de nuevos comentarios. Es molesto que no pueda tener un resultado para cada término y un valor de sí / no para si hay algún comentario nuevo sobre alguno de los nodos para ese término, sin embargo, no creo que esto sea un error, es por diseño.
Evanss
0

Aquí hay un boceto de una respuesta que te llevará la mayor parte del camino, creo. Comience creando una vista de nodos, luego agregue la taxonomía y el último tiempo de comentario como campos.

Ahora active la agregación para la vista y configure la agregación para el campo de taxonomía como "agrupar resultados", en la columna "tid".

Cambie la configuración de agregación para el campo de tiempo de comentario a "Máximo".

Ahora debería tener una vista que enumere todos sus términos de taxonomía (al menos los que tienen contenido) con la última fecha de comentario. El último paso será procesar la marca de tiempo del comentario en un enlace de vistas o tema para que se muestre como lo requiera, lo que debería ser relativamente simple.

Alfred Armstrong
fuente
¿Cómo hago el último paso de 'Cambiar la configuración de agregación para que el campo de tiempo de comentario sea "Máximo"? ?
Evanss
Una vez que haya activado la configuración de agregación, todos los campos de la lista en Campos deben tener un enlace de configuración de agregación al lado. Haga clic en eso y debería ver un menú desplegable llamado "tipo de agregación". Máximo es una de las opciones.
Alfred Armstrong
He hecho esto pero no está agrupando los resultados por término de taxonomía. Todavía tengo un resultado para cada nodo.
Evanss
¿Estableció la agregación para el campo de taxonomía como "agrupar resultados", en la columna "tid", según mi respuesta? He probado este método, así que estoy bastante seguro de que funciona.
Alfred Armstrong
1
Probé este enfoque en una instalación de prueba y obtuve los resultados como se describe, por lo que debe haber alguna diferencia con lo que hemos hecho. ¿Eliminó el campo de título del nodo? No lo necesitas y arruinará el resultado.
Alfred Armstrong el
0

Primero debe realizar otra consulta, para recuperar los términos que tienen nodos con nuevos contenidos.

Este hilo me ayudó .

Como te dije, puse todo esto en los campos php; si tiene tiempo, será mejor ponerlo en un módulo, en views_query_alter o de lo contrario.

  1. Agregue un campo php y, en el código de configuración , vaya a buscar la lista de términos que tienen contenido nuevo:

    $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. Ahora en el código de salida , verifique que su término esté en esta matriz:

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

Esto es lo más ligero que veo, incluso si la consulta puede ser pesada si tiene una gran cantidad de nodos y comentarios.

EDITAR: Tengo que recordar que poner php en el sql con vistas php NO es una buena práctica , lo invito a poner todo eso en un módulo personalizado en hook_views_query_alter tan pronto como sea posible.

Gregory Kapustin
fuente
Me temo que no funciona. Cada término tiene el campo de '¡nuevos comentarios!' a pesar de que solo algunos realmente tienen nuevos comentarios sobre su contenido. La única excepción es el término que no tiene ningún nodo en absoluto.
Evanss
@kiamlaluno editó el código. Funciona ahora ? Lo hace por mí :)
Gregory Kapustin
No cambié el código; Simplemente reformateé el texto. :) Si no funciona para @jdln, pero funciona para usted, entonces es posible que esté aplicando el código de manera diferente o que los términos de la taxonomía se tomen de diferentes vocabularios (por ejemplo, una taxonomía de etiqueta).
kiamlaluno