Показать, есть ли «новые» комментарии к просмотру терминов?


7

У меня есть комментарии по узлам, которые классифицированы по терминам. Мне нужно показать представление терминов и, если есть какие-либо новые комментарии в любом из узлов, которым этот тег помечен.

Так что, если у меня есть следующее:

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

Мне нужно, чтобы мой взгляд выглядел так:

Term1  new comments!
Term2
Term3  new comments!
Term4

Сначала я попытался просмотреть комментарии, чтобы включить новое поле комментариев и использовать отношения для отображения терминов. Однако, если у термина нет узлов или комментариев (термин 4 в моем примере), мне нужно, чтобы этот термин все еще отображался.

Поэтому я попытался составить представление об условиях. Я добавил отношения «Термин таксономии: контент с термином» и поле «Контент: новые комментарии», в котором используется эта связь. Это показывает количество новых комментариев, как и ожидалось. Он дает мне дублированные результаты (которые я могу исправить с помощью группировки полей), но неожиданно он также скрывает термины, которые не имеют комментариев или узлов.

Правильно ли я иду по этому пути, и если да, то как я могу остановить скрытие «пустых» терминов?

ОБНОВЛЕНИЕ Я обновил ядро ​​D и несколько модулей, которые имели новые версии (но не представления). Представление прекрасно работает с отношением «Настроить взаимосвязь: термин таксономии: контент с термином», когда в поле «Содержимое: заголовок (заголовок)». Однако, когда я добавляю поле «Содержимое: Новые комментарии», термины без комментариев скрываются.

ОБНОВЛЕНИЕ Ive попробовал следующее в поле зрения:

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

ОБНОВЛЕНИЕ - под «новыми комментариями» я подразумеваю комментарии, которые вошедший в систему пользователь не прочитал. Это стандартное поле в представлениях. Мне нужно это, а не произвольную дату отсечь. Извините за путаницу.


Термины все еще скрыты, если отношение представлений установлено как не обязательное?
Дэвид Томас

Вот вещи отладки, которые я бы рассмотрел, если бы это был я, ответы на которые могут помочь кому-то ответить на этот вопрос: 1) Появляются ли снова термины при удалении поля «Новые комментарии», отношения и / или обоих? 2) Что происходит, когда вы используете Term Name в качестве поля группировки или добавляете Term Id и используете его в качестве поля группировки? 3) 2) Является ли поле имени термина определенно Taxonomy term: Term name и нет Content: -term vocabulary-(легкая ошибка!) 4) Видите ли вы то же самое, если создаете новое представление «Условия таксономии» с нуля только с отношениями, Taxonomy Term: Term Nameи Content: New Comments?
user56reinstatemonica8

с какой версией drupal вы работаете? с какой версией просмотров? вы работаете с отношениями по определенной причине? Вы пробовали вместо этого "группировать по"?
Pasine

@ notme я использую последние drupal и модули. Поскольку у меня есть представление терминов, мне нужно использовать отношение, чтобы добраться до поля, которое показывает, есть ли у узлов новые комментарии.
Evanss

1
@ notme, если представление представляет собой список узлов, то опять же - термины, к которым не прикреплены узлы, не будут доступны, поэтому проблема будет той же. jdln, не идеальное решение, но как насчет добавления нового вложения в ваше представление, которое отображает только те термины, у которых нет узлов, и прикрепления этого отображения в обычном представлении страницы? Будет ли это работать? Тогда термины без узлов всегда будут печататься внизу, поэтому сортировка будет не такой простой, но, возможно, это вариант.
Борина Дитчева

Ответы:


1

Это работает для меня. У меня есть представление термина, которое показывает поле имени термина, и мой код добавляет новый флаг комментария после названия термина.

Код идет в пользовательском модуле.

Вам нужно изменить на VIEW_NAME имя вашего представления, а TAXONOMY_FIELD_NAME на имя вашего поля (например, 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!';
      }
    }
  }
}

Под «новыми» комментариями я подразумеваю комментарии, которые зарегистрированный пользователь не видел. Это стандартное поле в представлениях. Использует ли это ваш код или это произвольное значение даты? Из ваших комментариев кода это похоже на последнее?
Evanss

В дополнение к комментарию @ jdln выше, historyтаблица содержит данные о прочитанных узлах по uid.
AyeshK

Он использовал время последнего доступа пользователя, поэтому он отображал комментарии, написанные с момента последнего входа пользователя. Для вышедших пользователей использовался фиксированный период в 2 недели. Теперь я изменил его так, что он работает только для зарегистрированных пользователей и основан на том, когда пользователь в последний раз просматривал узлы, на которых находятся комментарии.
Роуби

0

Добавление поля «Содержимое: Новые комментарии» добавляет INNER JOINв таблицу node_comment_statistics, которая потенциально может быть источником проблем, с которыми вы столкнулись. (Например, если нет никаких записей для NodeC, узлового и NodeE в node_comment_statistics по какой - то причине, условия не будут показаны из - за JOINбудучи INNERодин.)

Помогает ли перестройка node_comment_statistics ?


Причина, по которой я получаю дополнительные результаты, заключается в том, что я получаю результат для каждого узла, поскольку каждый узел имеет числовое значение для количества новых комментариев. Раздражает то, что я не могу просто получить результат для каждого термина и значение да / нет, если есть какие-либо новые комментарии к любому из узлов для этого термина, однако я не думаю, что это ошибка, по своей конструкции.
Evanss

0

Вот набросок ответа, который, я думаю, поможет вам в этом. Начните с создания представления узлов, затем добавьте таксономию и время последнего комментария в качестве полей.

Теперь включите агрегацию для представления и установите для столбца «tid» агрегирование для поля таксономии, которое будет «группировать результаты вместе».

Измените параметр агрегации для поля времени комментария на «Максимум».

Теперь у вас должно появиться представление, в котором перечислены все ваши термины таксономии (по крайней мере, те, которые имеют содержание) с датой последнего комментария. Последний шаг будет заключаться в том, чтобы обработать метку времени комментария в хуке представлений или тематике, чтобы он отображался так, как вам нужно, что должно быть относительно просто.


Как выполнить последний шаг «Измените параметр агрегирования для поля времени комментария на« Максимум ».» ?
Evanss

После включения параметров агрегирования каждое поле в списке в разделе «Поля» должно иметь ссылку для настройки агрегации рядом с ним. Нажмите на это, и вы должны увидеть выпадающее меню с пометкой «тип агрегации». Максимум - один из вариантов.
Альфред Армстронг

Я сделал это, но не группировал результаты по таксономии. У меня все еще есть результат для каждого узла.
Evanss

Вы установили агрегацию для поля таксономии как "группировать результаты вместе" в столбце "tid" согласно моему ответу? Я проверил этот метод, поэтому я уверен, что он работает.
Альфред Армстронг

1
Я опробовал этот подход на тестовой установке и получил результаты, как описано, поэтому должно быть какое-то различие в том, что мы сделали каждый. Вы удалили поле заголовка узла? Вам это не нужно, и это испортит результат.
Альфред Армстронг

0

Сначала нужно сделать еще один запрос, чтобы получить термины, в которых есть узлы с новым содержанием.

Мне помогла эта тема .

Как я уже говорил, я помещаю все это в поля php; если у вас есть время, лучше поместить его в модуль, в views_query_alter или в другое.

  1. Добавьте поле php и в коде установки перейдите к списку терминов, которые имеют новое содержание:

    $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. Теперь в выходном коде проверьте, что ваш термин находится в этом массиве:

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

Это самое легкое, что я вижу, даже если запрос может быть тяжелым, если у вас большое количество узлов и комментариев.

РЕДАКТИРОВАТЬ: я должен напомнить, что размещение php в sql с представлениями php НЕ является хорошей практикой , я предлагаю вам как можно скорее поместить все это в пользовательский модуль в hook_views_query_alter.


Боюсь, это не работает. Каждый термин имеет поле «новые комментарии!» хотя только некоторые на самом деле имеют новые комментарии к своему содержанию. Единственным исключением является термин, который вообще не имеет никаких узлов.
Evanss

@kiamlaluno отредактировал код. Это работает сейчас? Это для меня :)
Григорий Капустин

Я не изменил код; Я просто переформатировал текст. :) Если это не работает для @jdln, но работает для вас, то возможно, что вы применяете код по-разному, или термины таксономии взяты из разных словарей (например, тег таксономии).
kiamlaluno
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.