自己写的drupal区块

升级Trackback模块到v 1.30(Drupal 4.6)以及相关问题

对Trackback模块最新版本的追求充分体现了“时髦”的代价。Drupal4.5.0推出的时候,Trackback 推出了与之匹配的v1.14,这个版本的问题多多,譬如把trackback和评论混同起来,在每篇blog文章里凭空添加一个多余的"trackback" tab等等,在被多人诟病之后,作者作出了升级,但是这次升级并未作为Drupal 4.5.0的正式版本,正式版本仍然是v 1.14,升级版只是可以从CVS那里下载到,这次升级的最大变动就是数据库结构的更改,因为作者没有把这次升级作为最终升级版,所以并没有提供升级数据库的脚本。当时我为了紧追潮流,立刻升级为CVS,但是由于前后两个数据库的差别非常之大,我就放弃了手动升级数据库(表),而是删除了旧的,直接使用新的,好在当时没有几条Trackback,所以也不是一个问题。

从那以后我紧跟Trackback的CVS,好处是修正了一个又一个小错误,譬如不能直接删除trackback,在没有trackback的时候在blog的摘要下面显示"0 trackback",发送成功后无法显现成功发送的站点等等,终于我跟到了v 1.28,这个v1.28已经支持Drupal 4.6.0,所以就拿来用了 。值得注意的是,从v1.15到v1.28,trackback的数据库结构都没有发生改变。

终于,Trackback推出Drupal 4.6.0的正式版了,第一个版本是v1.29,本来要升级,但是一看,God,数据库结构又变了,正在吃惊之余,v1.30推出了,支持了Spam模块,提供了数据库升级脚本,但是只提供了从v1.14直接升级到v1.30的脚本,并没有其他版本升级的脚本,把俺这个铁杆的粉丝搁在了v1.28,进退两难了, 55~~。

懒了一段时间没去管它,但是想到最终这个问题还是要解决的,还是趁早吧,恰好又看到intertia贴的一条评论,所以花了点功夫把Trackback从v1.28升级到v1.30,主要是数据库的升级,步骤如下:

首先,建立一个Spam_trackbacks表:

CREATE TABLE spam_trackbacks (
trid int(10) unsigned NOT NULL default '0',
rating int(2) unsigned default '0',
spam tinyint(1) unsigned default '0',
last int(11) unsigned default '0',
PRIMARY KEY trid (trid),
KEY rating (rating),
KEY spam (spam),
KEY last (last)
);

然后,在原来trackback_received表格中添加一个新的叫做Status的column(主要是用于设置trackback是否publish):


ALTER TABLE `trackback_received` ADD `status` TINYINT( 1 ) UNSIGNED DEFAULT '0' AFTER `excerpt`

数据库的更改搞定(希望以上就是1.28与1.30数据库不同的地方,如果还有其他的不同,那可要哭死了~~),然后上传新的trackback模块,更改设定,设置spam,blah blah blah。。。按照惯例就行了。 到此搞定一切。

下面是其他几个问题:

首先关于显示最新trackback的block的问题,初步更改如下,主要解决了显示Unpublished的问题,和如何直接显示到Trackback的问题:
$result = db_query_range('SELECT * FROM {trackback_received} where status=1 ORDER BY created DESC', 0, 10);
//添加 status=1
while ($trackback = db_fetch_object($result)) {
echo "

  • $trackback->subject
  • ";
    //添加锚点,但是似乎只在firefox下有效,在IE下没有太大作用
    }
    ?>

    更进一步,这个区块可以用user_access函数来写,更优化一些,另外可以加入发布时间,利用theme函数来进行格式化等等,但是今天没有时间了,只改了最关紧的地方,其他的改天再改进吧。

    Blog分类: 

    写了一个分类的显示区块

    Drupal升级到4.6之后,不知道什么缘故,原来的分类区块被省略掉了,没有了这个区块,多少会让人觉得不方便,所以自己写了一个分类区块,如下:

    if (user_access('access content')) {
    $result = db_query("SELECT d.tid, d.name, MAX(n.created) AS updated, COUNT(*) AS count FROM {term_data} d INNER JOIN {term_node} USING (tid) INNER JOIN {node} n USING (nid) WHERE n.status = 1 GROUP BY d.tid, d.name ORDER BY updated DESC, d.name");
    //读取分类关键词,最新文章创建的时间,降序排列
    $items = array();
    while ($category = db_fetch_object($result)) {
    $items[] = l($category->name .' ('. $category->count .')', 'taxonomy/term/'. $category->tid) .'
    '. t('%time ago', array('%time' => format_interval(time() - $category->updated)));
    }
    //按照以前的格式显示分类区块,包括最后一片帖子的发布时间。
    return theme('item_list', $items);
    }
    ?>
    我的blog的左侧有一个例子,如果你不需要显示“最近更新时间”,代码可以简化许多,hoho,其实没必要用PHP了,用HTML做个静态链接就行了:)

    Blog分类: 

    做了一个显示最新的引用(trackback)的区块

    呵呵,等不及作者的升级了,我自己先土土的写一个block吧。再次说明一下,因为我没有钻研过Drupal的函数手册,所以这些block可能不是很in,不过咱们就实用主义吧,能用就行:)下面是代码,右边有一个范例,就是那个叫做“最新引用(trackback)”的区块,我还没有来得及用CSS美化那个list,所以没有缩进,看起来不是很美观,慢慢来,先实现了功能再说。另外,这是针对cvs版的trackback写的(ver 1.25),如果你使用的是4.5.x的trackback模块,需要根据数据库的结构作些调整。

    $result = db_query_range('SELECT * FROM {trackback_received} ORDER BY created DESC', 0, 10);
    //将trackback_received表格按时间降序排列,选举最新的10条。你可以按需要更改数目。
    while ($trackback = db_fetch_object($result)) {
    echo "

  • $trackback->subject
  • ";
    //这段土,不过没有办法啊,呵呵。
    }?>

    呵呵,这样就可以,其实挺简单的:)

    Blog分类: 

    做一个简单的计数区块

    昨天有人问的,研究了一下,因为对Drupal本身的函数结构不是很熟悉,所以到Drupal函数手册那里去钻研了一下,可惜里面的东西太复杂,所以就用了一种比较土的方式解决了,如下。呵呵,同时还想试一下新安装的编码过滤器,因为昨天发现没有这个过滤器的时候,所有的php代码的前提示符都会被滤掉。

    $n_of_comments= db_result(db_query('SELECT count(*) FROM comments'));
    $n_of_posts=db_result(db_query('SELECT count(*) FROM node'));
    $n_of_blogs=db_result(db_query("select count(*) from node where type='blog'"));
    print "本站共有blog $n_of_blogs 篇
    ";
    print "本站共有文章 $n_of_posts 篇
    ";
    print "本站共有评论 $n_of_comments 篇"; ?>

    当然,如果你嫌这个显示出来的效果比较土,还可以加style,譬如输出时

    print "本站共有blog $n_of_blogs 篇
    ";

    我的站点的右下角有一个没有加修饰的例子。

    其他的数据可以列出,譬如一共有多少论坛话题,一共有多少tag,一共有多少用户,只需要稍微修改一下上面这段代码就可以了:)


    update:做了一个小小的更改,max(nid)不等于你所有的node的总数,而是等于曾经有过的node的最大值,因为你即便是删除了一个node,这个id已经被它占有,后边的node id不会再发生变化,所以应该使用 count(*),呵呵,刚才秀豆了。

    Blog分类: