Mostrar se há comentários 'novos' em uma exibição de termos?


7

Tenho comentários sobre nós que são categorizados por termos. Preciso mostrar uma visão dos termos e se há novos comentários em qualquer um dos nós com os quais o termo está marcado.

Então, se eu tiver o seguinte:

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

Eu preciso da minha visão para ficar assim:

Term1  new comments!
Term2
Term3  new comments!
Term4

Primeiro, tentei fazer uma visualização dos comentários para incluir o novo campo de comentários e usar relacionamentos para mostrar os termos. No entanto, se um termo não tiver nós ou comentários (Term4 no meu exemplo), preciso que o termo ainda seja exibido.

Então tentei fazer uma visualização dos termos. Adicionei os relacionamentos 'Termo de taxonomia: conteúdo com termo' e o campo 'Conteúdo: novos comentários' que usa esse relacionamento. Isso mostra o número de novos comentários conforme o esperado. Isso me fornece resultados duplicados (que podem ser corrigidos com os campos de agrupamento), mas inesperadamente também oculta os termos que não têm comentários ou nós.

Estou fazendo isso da maneira certa e, em caso afirmativo, como posso impedir que os termos 'vazios' sejam ocultos?

ATUALIZAÇÃO Atualizei o núcleo D e alguns módulos que tinham novas versões (mas não exibições). A visualização funciona bem com o relacionamento 'Configurar relacionamento: termo de taxonomia: conteúdo com termo' quando o campo é 'Conteúdo: título (título)'. No entanto, quando adiciono o campo 'Conteúdo: novos comentários', os termos que não têm comentários ficam ocultos.

UPDATE Tentei o seguinte em um campo de visualizações:

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

ATUALIZAÇÃO - por 'novos comentários', quero dizer comentários que o usuário conectado não leu. Este é um campo padrão nas visualizações. Preciso disso em vez de uma data arbitrária cortada. Desculpe por qualquer confusão.


Os termos ainda estão ocultos se o relacionamento de visualizações estiver definido como não necessário?
David Thomas

Aqui estão as coisas de depuração que eu examinaria se fosse eu, responder a estas perguntas pode ajudar alguém a responder: 1) Os termos reaparecem na remoção do campo Novos comentários, do relacionamento e / ou de ambos? 2) O que acontece quando você usa o Nome do Termo como um campo de agrupamento ou adiciona o ID do Termo e o usa como um campo de agrupamento? 3) 2) O campo do nome do termo é definitivo Taxonomy term: Term name e não é Content: -term vocabulary-(erro fácil de cometer!) 4) Você vê a mesma coisa se criar uma nova visualização dos Termos de Taxonomia do zero apenas com o relacionamento Taxonomy Term: Term Namee Content: New Comments?
precisa saber é o seguinte

com qual versão do drupal você está trabalhando? com qual versão das visualizações? você está trabalhando com relacionamento por um motivo específico? você tentou a opção "agrupar por"?
pasine

@notme estou usando o drupal e os módulos mais recentes. Como tenho uma visão dos termos, preciso usar um relacionamento para chegar ao campo que mostra se os nós têm novos comentários.
Evanss 02/01

11
@notme, se a visualização for uma lista de nós, novamente - termos que não têm nós anexados não estariam disponíveis, portanto o mesmo problema seria válido. jdln, não é uma solução perfeita, mas que tal adicionar um novo anexo à sua exibição que exibe apenas termos que não têm nós e anexá-lo à exibição normal da página? Isso funcionaria? Em seguida, os termos sem nós sempre são impressos na parte inferior, portanto, a classificação não seria tão fácil - mas talvez seja uma opção.
Boriana Ditcheva

Respostas:


1

Isso funciona para mim. Eu tenho uma visão de termo que mostra o campo nome do termo e meu código adiciona o novo sinalizador de comentário após o nome do termo.

O código entra em um módulo personalizado.

Você precisa alterar para VIEW_NAME para seu nome de exibição e TAXONOMY_FIELD_NAME para o nome do seu campo (como tags de campo, por exemplo).

/**
 * 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!';
      }
    }
  }
}

Por "novos" comentários, quero dizer comentários que o usuário conectado não viu. Este é um campo padrão nas visualizações. Seu código usa isso ou é um valor de data arbitrário? Pelos seus comentários de código, parece que o último?
Evanss

Além do comentário de @ jdln acima, a historytabela contém dados de nós de leitura por uid.
precisa saber é

Ele estava usando o último horário de acesso do usuário, para mostrar comentários escritos desde a última vez que o usuário fez logon. Para usuários desconectados, estava usando um período fixo de 2 semanas. Agora eu mudei para que funcione apenas para usuários conectados e é baseado na última vez que o usuário visualizou os nós nos quais os comentários estão.
ROOBY

0

A adição do campo 'Conteúdo: novos comentários' adiciona um valor INNER JOINà tabela node_comment_statistics, que pode ser a origem dos problemas que você está enfrentando. (Por exemplo, se não houver entradas para NodeC, NodeD e NodeE em node_comment_statistics por algum motivo, os termos não serão mostrados devido a JOINserem INNERum.)

A reconstrução de node_comment_statistics ajuda?


A razão pela qual estou obtendo resultados extras é que recebo um resultado para cada nó, pois cada nó tem um valor numérico para o número de novos comentários. É irritante que eu não possa apenas ter um resultado para cada termo e um valor sim / não, se houver novos comentários em qualquer um dos nós para esse termo, no entanto, eu não acho que isso seja um bug, é por design.
Evanss

0

Aqui está um esboço de uma resposta que o levará quase todo o caminho até lá, eu acho. Comece criando uma exibição de nós e adicione a taxonomia e o tempo do comentário mais recente como campos.

Agora ative a agregação para a visualização e defina a agregação para o campo taxonomia como "agrupar resultados juntos", na coluna "tid".

Altere a configuração de agregação para o campo de tempo do comentário para "Máximo".

Agora você deve ter uma visualização que lista todos os seus termos de taxonomia (pelo menos aqueles que possuem conteúdo) com a data do último comentário. A etapa final será processar o registro de data e hora do comentário em um gancho de visualizações ou tema para torná-lo exibido conforme necessário, o que deve ser relativamente simples.


Como faço para a última etapa de 'Alterar a configuração de agregação para o campo de tempo do comentário como "Máximo".' ?
perfil completo de Evanss

Depois de ativar as configurações de agregação, todos os campos da lista em Campos deverão ter um link de configurações de agregação ao lado. Clique nele e você verá um menu suspenso chamado "tipo de agregação". Máximo é uma das opções.
Alfred Armstrong

Fiz isso, mas não está agrupando os resultados por termo de taxonomia. Eu ainda tenho um resultado para cada nó.
perfil completo de Evanss

Você definiu a agregação para o campo taxonomia como "agrupar resultados juntos", na coluna "tid", conforme minha resposta? Eu testei esse método, por isso estou bastante confiante de que funciona.
Alfred Armstrong

11
Eu tentei essa abordagem em uma instalação de teste e obtive os resultados conforme descrito, portanto deve haver alguma diferença no que cada um de nós fez. Você removeu o campo de título do nó? Você não precisa e isso atrapalha o resultado.
Alfred Armstrong

0

Você deve fazer outra consulta primeiro, para recuperar os termos que possuem nós com novos conteúdos.

Fui ajudado por esta discussão .

Como eu disse, coloquei tudo isso nos campos php; se você tiver tempo, será melhor colocá-lo em um módulo, em um views_query_alter ou então.

  1. Adicione um campo php e, no código de configuração , acesse a lista de termos das marés que têm novo conteúdo:

    $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. Agora no código de saída , verifique se seu termo está nesta matriz:

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

É o mais leve que vejo, mesmo que a consulta possa ser pesada se você tiver uma grande quantidade de nós e comentários.

EDIT: Devo lembrar que colocar php no sql com views php NÃO é uma boa prática , convido você a colocar tudo isso em um módulo personalizado em hook_views_query_alter o mais rápido possível.


Receio que não esteja funcionando. Todo termo tem o campo de 'novos comentários!' mesmo que apenas alguns tenham novos comentários sobre o conteúdo. A única exceção é o termo que não possui nenhum nó.
Evanss

@kiamlaluno editou o código. Isso funciona agora? Ele faz para mim :)
Gregory Kapustin

Não mudei o código; Eu simplesmente reformatei o texto. :) Se não funcionar para @jdln, mas funcionar para você, é possível que você esteja aplicando o código de maneira diferente ou que os termos de taxonomia sejam retirados de vocabulários diferentes (por exemplo, uma taxonomia de tag).
kiamlaluno
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.