原来这里的回复是采用thread形式显示的,我个人比较习惯于这种,但评论比较多的时候由于缩进的原因就会被挤成一窄条,很不方便。而且似乎一般用户以及大多数blog的习惯还是采用平板显示,所以这一次的目标同样还是参照WordPress的样式,采用平板显示同时对评论按次序标号。
- 首先到管理 >> 评论 >> 设置下面把评论显示改成"平板(旧帖在前)"。同时禁用评论标题,毕竟大多数评论标题也没什么意义,而且可以自动截取。
- 这之后的评论显示是这样的样式:

仍然显示了自动截取的标题,浪费了不少版面,可以通过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类。修改后的评论显示就成了这个样子:

- 为评论加上序号。由于采用平板式显示,习惯上会为评论加上序号方便大家回贴,否则就会有点不知所云,下面看看怎么做这个。一开始的时候,关于如何给一个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>
就得到了最终的效果:)

- 一点小问题,使用上面的$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
我就一直找不到给评论排队显示序号的方法。原来有这么简单的方法,还正准备用有序列表来实现呢。
我用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;
}
发表新评论