Mostra se ci sono "nuovi" commenti in una vista di termini?


7

Ho commenti su nodi che sono classificati in base ai termini. Devo mostrare una visione dei termini e se ci sono nuovi commenti in uno qualsiasi dei nodi con cui il termine è taggato.

Quindi se ho il seguente:

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

Ho bisogno che la mia vista sia simile a questa:

Term1  new comments!
Term2
Term3  new comments!
Term4

Per prima cosa ho provato a fare una vista dei commenti per includere il nuovo campo dei commenti e usare le relazioni per mostrare i termini. Tuttavia, se un termine non ha nodi o commenti (Term4 nel mio esempio) ho bisogno che il termine sia ancora visualizzato.

Quindi ho provato a dare una visione dei termini. Ho aggiunto le relazioni "Termine tassonomia: contenuto con termine" e il campo "Contenuto: nuovi commenti" che utilizza questa relazione. Questo mostra il numero di nuovi commenti come previsto. Mi dà risultati duplicati (che potrei essere in grado di correggere con i campi di raggruppamento) ma inaspettatamente nasconde anche i termini che non hanno commenti o nodi.

Sto andando nel modo giusto e, in tal caso, come posso impedire che i termini "vuoti" vengano nascosti?

AGGIORNAMENTO Ho aggiornato D core e alcuni moduli con nuove versioni (ma non viste). La vista funziona perfettamente con la relazione di "Configura relazione: termine tassonomia: contenuto con termine" quando il campo è "Contenuto: titolo (titolo)". Tuttavia, quando aggiungo il campo "Contenuto: nuovi commenti", i termini che non hanno commenti vengono nascosti.

AGGIORNAMENTO Ho provato quanto segue in un campo visualizzazioni:

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

AGGIORNAMENTO: per "nuovi commenti" intendo i commenti che l'utente che ha effettuato l'accesso non ha letto. Questo è un campo standard nelle viste. Ho bisogno di questo piuttosto che di una data arbitraria interrotta. Ci scusiamo per qualsiasi confusione.


I termini sono ancora nascosti se la relazione visualizzazioni è impostata su non richiesta?
David Thomas,

Ecco le cose di debug che prenderei in considerazione se fossi io, rispondere a queste può aiutare qualcuno a rispondere a questo: 1) I termini riappaiono rimuovendo il campo Nuovi commenti, la relazione e / o entrambi? 2) Cosa succede quando si utilizza Term Name come campo di raggruppamento o, se si aggiunge Id Term e lo si utilizza come campo di raggruppamento? 3) 2) Il campo del nome del termine è sicuramente Taxonomy term: Term name e non Content: -term vocabulary-(errore facile da fare!) 4) Vedi la stessa cosa se crei una nuova vista Termini di tassonomia da zero con solo la relazione, Taxonomy Term: Term Namee Content: New Comments?
user56reinstatemonica8

con quale versione di drupal stai lavorando? con quale versione di visualizzazioni? stai lavorando con una relazione per un motivo particolare? hai provato invece l'opzione "raggruppa per"?
pasine,

@notme im utilizzando l'ultimo drupal e moduli. Dato che ho una visione dei termini, devo usare una relazione per arrivare al campo che mostra se i nodi hanno nuovi commenti.
Evanss,

1
@notme, se la vista è un elenco di nodi, anche in questo caso - i termini a cui non sono collegati nodi non sarebbero disponibili, quindi lo stesso problema sarebbe risolto. jdln, non una soluzione perfetta, ma che ne dici di aggiungere un nuovo allegato alla tua vista che mostra solo termini che non hanno nodi e di allegare quella visualizzazione sotto la normale vista della pagina? Funzionerebbe? Quindi i termini senza nodi verrebbero sempre stampati in fondo, quindi l'ordinamento non sarebbe così facile - ma forse è un'opzione.
Boriana Ditcheva,

Risposte:


1

Questo funziona per me. Ho una vista dei termini che mostra il campo del nome del termine e il mio codice aggiunge il nuovo flag di commento dopo il nome del termine.

Il codice va in un modulo personalizzato.

Devi cambiare in VIEW_NAME con il nome della tua vista e TAXONOMY_FIELD_NAME con il nome del tuo campo (come field_tags per esempio).

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

Per "nuovi" commenti intendo commenti che l'utente che ha effettuato l'accesso non ha visto. Questo è un campo standard nelle viste. Il tuo codice lo utilizza o è un valore di data arbitrario? Dai commenti del tuo codice sembra che sia quest'ultimo?
Evanss,

Oltre al commento di @ jdln sopra, la historytabella contiene i dati dei nodi letti di uid.
AyeshK,

Stava utilizzando l'ultimo tempo di accesso dell'utente, quindi mostrava i commenti scritti dall'ultimo accesso dell'utente. Per gli utenti disconnessi utilizzava un periodo fisso di 2 settimane. Ora l'ho modificato in modo che funzioni solo per gli utenti che hanno effettuato l'accesso e si basa sull'ultima volta in cui l'utente ha visualizzato i nodi su cui si trovano i commenti.
rooby

0

L'aggiunta del campo "Contenuto: nuovi commenti" aggiunge un INNER JOINalla tabella node_comment_statistics, che può potenzialmente essere la fonte dei problemi che si verificano. (Ad esempio, se non ci sono voci per NodeC, NodeD e NodeE in node_comment_statistics per qualche motivo, i termini non verranno visualizzati a causa del JOINfatto che sono INNERuno).

La ricostruzione di node_comment_statistics aiuta?


Il motivo per cui ottengo i risultati extra è che ottengo un risultato per ciascun nodo, poiché ogni nodo ha un valore numerico per il numero di nuovi commenti. È fastidioso che non possa avere solo un risultato per ogni termine e un valore sì / no per se ci sono nuovi commenti su uno dei nodi per quel termine, tuttavia non penso che questo sia un bug, è di progettazione.
Evanss,

0

Ecco uno schizzo di una risposta che ti porterà in gran parte lì, credo. Inizia creando una vista di nodi, quindi aggiungi la tassonomia e il tempo di commento più recente come campi.

Ora attiva l'aggregazione per la vista e imposta l'aggregazione per il campo della tassonomia su "raggruppa i risultati", nella colonna "tid".

Modificare l'impostazione di aggregazione per il campo del tempo di commento su "Massimo".

Ora dovresti avere una vista che elenca tutti i termini della tua tassonomia (almeno quelli che hanno dei contenuti) con la data dell'ultimo commento. Il passaggio finale sarà quello di elaborare il timestamp del commento in un hook di visualizzazioni o in un tema per renderlo visualizzato come richiesto, il che dovrebbe essere relativamente semplice.


Come faccio a eseguire l'ultimo passaggio di "Modifica l'impostazione di aggregazione per il campo del tempo di commento su" Massimo ". ?
Evanss,

Dopo aver attivato le impostazioni di aggregazione, ogni campo nell'elenco in Campi dovrebbe avere un collegamento alle impostazioni di aggregazione accanto ad esso. Cliccaci sopra e dovresti vedere un menu a discesa etichettato "tipo di aggregazione". Il massimo è una delle opzioni.
Alfred Armstrong,

Ho fatto questo, ma non sta raggruppando i risultati per termine di tassonomia. Ho ancora un risultato per ogni nodo.
Evanss,

Hai impostato l'aggregazione per il campo della tassonomia su "raggruppa risultati", nella colonna "tid", come da mia risposta? Ho testato questo metodo, quindi sono abbastanza sicuro che funzioni.
Alfred Armstrong,

1
Ho provato questo approccio su un'installazione di prova e ho ottenuto i risultati come descritto, quindi ci deve essere qualche differenza con ciò che abbiamo fatto ciascuno. Hai rimosso il campo del titolo del nodo? Non ne hai bisogno e rovinerà il risultato.
Alfred Armstrong,

0

Devi prima fare un'altra query, per recuperare i termini che hanno nodi con nuovi contenuti.

Sono stato aiutato da questa discussione .

Come ti ho detto, ho messo tutto questo nei campi php; se hai tempo, sarà meglio metterlo in un modulo, in un views_query_alter o altro.

  1. Aggiungi un campo php e, nel codice di configurazione , vai a prendere l'elenco dei termini delle offerte che hanno nuovi contenuti:

    $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. Ora nel codice di output , controlla che il tuo termine sia in questo array:

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

Questo è il più leggero che vedo, anche se la query può essere pesante se hai una grande quantità di nodi e commenti.

EDIT: Devo ricordare che mettere php in sql con viste php NON è una buona pratica , ti invito a mettere tutto ciò in un modulo personalizzato in hook_views_query_alter il prima possibile.


Temo che non funzioni. Ogni termine ha il campo di "nuovi commenti!" anche se solo alcuni hanno effettivamente nuovi commenti sul loro contenuto. L'unica eccezione è il termine che non ha alcun nodo.
Evanss,

@kiamlaluno ha modificato il codice. Funziona adesso? Lo fa per me :)
Gregory Kapustin,

Non ho cambiato il codice; Ho semplicemente riformattato il testo. :) Se non funziona per @jdln, ma funziona per te, è possibile che tu stia applicando il codice in modo diverso, oppure i termini della tassonomia sono presi da vocabolari diversi (ad esempio una tassonomia dei tag).
kiamlaluno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.