显示术语视图中是否有“新”评论?


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

首先,我尝试查看评论以包括新的评论字段,并使用关系来显示术语。但是,如果一个术语没有节点或注释(在我的示例中为Term4),我需要将该术语显示出来。

因此,我然后尝试查看这些术语。我添加了关系“分类术语:带有术语的内容”和使用此关系的“内容:新评论”字段。这确实显示了预期的新评论数。它给了我重复的结果(我可以用分组字段来解决),但出乎意料的是,它也隐藏了没有注释或节点的术语。

我会以正确的方式这样做吗?如果是这样,我如何才能阻止隐藏“空”字?

更新Ive更新了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)当您使用术语名称作为分组字段,或者添加术语ID并将其用作分组字段时,会发生什么?3)2)这个术语名称字段肯定 Taxonomy term: Term name,而不是Content: -term vocabulary-(容易犯的错误!)4)你看到同样的事情,如果你创建一个新的分类术语从头查看与唯一的关系,Taxonomy Term: Term NameContent: New Comments
user56reinstatemonica8 2013年

您正在使用哪个版本的drupal?有哪些版本的视图?您是否出于特定原因与人际关系?您是否尝试了“分组依据”选项?
pasine

@notme im正在使用最新的drupal和模块。就术语而言,我需要使用一种关系到达显示节点是否有新注释的字段。
Evanss 2013年

1
@notme,如果视图是节点列表,则再次出现-没有附加节点的术语将不可用,因此也会出现同样的问题。jdln,不是一个完美的解决方案,但是如何在视图中添加仅显示没有节点的术语的新附件并将其显示在常规页面视图下呢?那行得通吗?然后,没有节点的术语将始终显示在底部,因此排序并非那么容易-但这也许是一个选择。
Boriana Ditcheva 2013年

Answers:


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周。现在,我对其进行了更改,使其仅适用于已登录的用户,并且基于用户上次查看注释所在的节点的时间。
rooby

0

添加“内容:新评论”字段会INNER JOIN在node_comment_statistics表中添加,这可能是您遇到的问题的根源。(例如,由于某种原因,如果由于某种原因在node_comment_statistics中没有NodeC,NodeD和NodeE的条目,则该术语将不会显示,因为JOIN它们是INNER一个。)

是否重建node_comment_statistics帮助?


之所以获得额外的结果,是因为每个节点都有一个结果,因为每个节点都有一个新注释数的数字值。令人烦恼的是,我不能对每个术语仅给出一个结果,对于该术语在任何节点上是否有任何新注释,就只能给出一个是/否值,但是我不认为这是一个错误,这是设计使然。
Evanss 2013年

0

我认为,这是一个答案的草图,它将使您获得大部分的收益。首先创建节点视图,然后将分类法和最新注释时间添加为字段。

现在,为视图打开聚合,并在“ tid”列上将分类法字段的聚合设置为“将结果分组在一起”。

将评论时间字段的聚合设置更改为“最大”。

现在,您应该有一个视图,其中列出了所有带有最新注释日期的分类法术语(至少是那些具有内容的术语)。最后一步是在视图挂钩或主题中处理评论时间戳,以使其按您的要求显示,这应该相对简单。


如何完成“将评论时间字段的汇总设置更改为“最大”的最后一步。” ?
Evanss

启用聚合设置后,“字段”下列表中的每个字段都应在其旁边具有一个聚合设置链接。单击该按钮,您应该看到一个标记为“聚合类型”的下拉菜单。最大值是选项之一。
2013年

我已经做到了,但是没有将每个分类术语的结果分组。对于每个节点,我仍然有结果。
Evanss 2013年

根据我的回答,您是否将分类法字段的汇总设置为“ 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与视图php放在sql中不是一个好习惯,我邀请您尽快将所有这些放在hook_views_query_alter的自定义模块中。


我担心它不起作用。每个词都有“新评论”领域!即使实际上只有一些人对其内容有新评论。唯一的例外是该词根本没有任何节点。
Evanss 2013年

@kiamlaluno编辑了代码。现在可以用吗?它对我
有用

我没有更改代码;我只是重新格式化了文本。:)如果它不适用于@jdln,但对您有用,则可能您应用的代码有所不同,或者分类法术语来自不同的词汇表(例如,标记分类法)。
kiamlaluno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.