改造评论(comments)的显示 -- 续

上次的贴子里主要讲了如何对评论/回复作斑马条显示,同时对作者自己的回复用特别底色标出,这次再作进一步的改造:)

原来这里的回复是采用thread形式显示的,我个人比较习惯于这种,但评论比较多的时候由于缩进的原因就会被挤成一窄条,很不方便。而且似乎一般用户以及大多数blog的习惯还是采用平板显示,所以这一次的目标同样还是参照WordPress的样式,采用平板显示同时对评论按次序标号。

  1. 首先到管理 >> 评论 >> 设置下面把评论显示改成"平板(旧帖在前)"。同时禁用评论标题,毕竟大多数评论标题也没什么意义,而且可以自动截取。
  2. 这之后的评论显示是这样的样式:
    Flat Comments 原始显示效果
    仍然显示了自动截取的标题,浪费了不少版面,可以通过theming在comment.tpl.php里面修改。以garland主体为例,删除下面这句:
      <h3><?php print $title ?></h3>

    同时,希望把发帖人放到左边醒目的地方,所以作如下修改:
    1) 在 <?php if ($submitted): ?>下面那一句中去掉发帖人名称,改成:
      <span class="submitted"><?php print t('!date', array('!date' => format_date($comment->timestamp))); ?></span>

    //加入这一段
        <span class='comment-num'># - <?php print t('!username', array('!username' => theme('username', $comment))); ?></span>
    //以下为原有内容
        <div class="content">
          <?php print $content ?>
        </div>

    注意上面的# - 部分是为显示评论序号预留的,同时加入相应的了comment-num CSS类。修改后的评论显示就成了这个样子:

  3. 为评论加上序号。由于采用平板式显示,习惯上会为评论加上序号方便大家回贴,否则就会有点不知所云,下面看看怎么做这个。一开始的时候,关于如何给一个node下的评论排定序号,还颇费了我一些脑筋,写了一个啰里啰唆的SQL查询,虽然基本可以工作,但感觉有点不值得。后来想到斑马条显示$zebra这个变量是现成的,灵机一动去看了看phptemplate.engine里面是如何取得这个$zebra变量的,发现实际上是通过一个static变量$count[$hook]来的,而这个$count[$hook]可以记录当前template被调用的次数,对于comment.tpl.php来说,第一条评论是1,第二条评论再次调用就变成2。。。正好就是当前页面评论的序号。只要在template里面直接调用$vars['id']就可以得到这个值,这下好办了!

    按照PHPTemplate的老习惯,到template.php里面通过_phptemplate_variables()加入这个新的变量$commentn,供comment.tpl.php调用显示评论序号:
    <?php
     
    if ($hook == 'comment') {
       
    //通过 l() 函数生成一个指向本条评论的链接
       
    $vars['commentn'] = l('#'.$vars['id'], $_GET['q'], NULL, NULL, "comment-".$vars['comment']->cid);
        return
    $vars;
      }
    ?>

    然后直接在comment.tpl.php里面把刚才的# 替换成$commentn :
        <span class='comment-num'><?php print $commentn; ?> - <?php print t('!username', array('!username' => theme('username', $comment))); ?></span>

    就得到了最终的效果:)
  4. 一点小问题,使用上面的$vars['id']的办法,只能对当前页面的评论排序,如果评论过多造成翻页的话,序号又从#1重新开始了;另外Drupal本身的分页pager就有问题,分页后的链接根本不工作,还是指回原节点。这也是一个老bug了,看起来感兴趣的人不多,所以一直没有解决。所以我这里采用了一个折中的办法,计算$pagenumber重新编号,把上面comment.tpl.php那一段又重新改写了一下:
    <?php
     
    if ($hook == 'comment') {
       
    $comment = $vars['comment'];
       
    $pagenum = $_GET['page'] ? $_GET['page'] : 0;
       
    $num = variable_get('comment_default_per_page', '50')*$pagenum + $vars['id'];
       
    $pagequery = $pagenum ? 'page='. $pagenum : NULL;
       
    $vars['commentn'] = l('#'.$num, $_GET['q'], NULL, $pagequery, "comment-$comment->cid");
        return
    $vars;
      }
    ?>


Comments

1 - holz (未验证)
这个不顶不行。

我就一直找不到给评论排队显示序号的方法。原来有这么简单的方法,还正准备用有序列表来实现呢。
2 - holz (未验证)
求助大米,这个问题可能相当低级,不过我对这些都没入门,所以~~~

我用zen改造了自己的主题,zen本身的template文件已经定义了作者评论,但我直接加入您文章中的代码后,并不能出现序号。

代码如下:

    case 'comment':
      // we load the node object that the current comment is attached to
      $node = node_load($vars['comment']->nid);
      // if the author of this comment is equal to the author of the node, we set a variable
      // then in our theme we can theme this comment differently to stand out
      $vars['author_comment'] = $vars['comment']->uid == $node->uid ? TRUE : FALSE;

      //code from verydummy.
      $comment=$var['comment'];
      $pagenum = $_GET['page']?$_GET['page']:0;
      $num = variable_get('comment_default_per_page','50')*$pagenum+$var['id'];
      $pagequery = $pagenum ? 'page='.$pagenum:NULL;
      $var['commentn'] = l('#'.$num, $_GET['q'],NULL,$pagequery,"comment-$comment->cid");
      break;
  }

3 - 大米
我没有仔细看zen的template,不过看你的贴的code好像有点小错误,应该是$vars['comment'],少了个s

发表新评论

此内容将保密,不会被其他人看见。
  • 允许的 HTML 标签: <blockquote> <div> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text, URLs will automatically be converted to links.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Every instance of "<!--tableofcontents-->" in the input text will be replaced with a collapsible mediawiki-style table of contents. Accepts options for title, list style, minimum heading level, and maximum heading level as follows: <!--tableofcontents list: ol; title: Table of Contents; minlevel: 1; maxlevel: 3;-->. All arguments are optional and defaults are shown.
  • Every instance heading tags will be modified to include an id attribute for anchor linking.
  • Images can be added to this post.
  • 网页地址和电子邮件地址将会被自动转换为链接。

更多格式化选项信息