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

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

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

Evanss
источник
Термины все еще скрыты, если отношение представлений установлено как не обязательное?
Дэвид Томас
Вот вещи отладки, которые я бы рассмотрел, если бы это был я, ответы на которые могут помочь кому-то ответить на этот вопрос: 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!';
      }
    }
  }
}
rooby
источник
Под «новыми» комментариями я подразумеваю комментарии, которые зарегистрированный пользователь не видел. Это стандартное поле в представлениях. Использует ли это ваш код или это произвольное значение даты? Из ваших комментариев кода это похоже на последнее?
Evanss
В дополнение к комментарию @ jdln выше, historyтаблица содержит данные о прочитанных узлах по uid.
AyeshK
Он использовал время последнего доступа пользователя, поэтому он отображал комментарии, написанные с момента последнего входа пользователя. Для вышедших пользователей использовался фиксированный период в 2 недели. Теперь я изменил его так, что он работает только для зарегистрированных пользователей и основан на том, когда пользователь в последний раз просматривал узлы, на которых находятся комментарии.
Роуби
0

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

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

Jamix
источник
Причина, по которой я получаю дополнительные результаты, заключается в том, что я получаю результат для каждого узла, поскольку каждый узел имеет числовое значение для количества новых комментариев. Раздражает то, что я не могу просто получить результат для каждого термина и значение да / нет, если есть какие-либо новые комментарии к любому из узлов для этого термина, однако я не думаю, что это ошибка, по своей конструкции.
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