Drupal

关于Drupal的安装、使用、问题、修改等的讨论。也是目前唯一的Drupal中文交流论坛。

Zoundry推出最新版本:1.0 beta, build 23 (April 21, 2006)

昨天刚推出的新版本,看了一下发布说明中的发布更新与更具体的功能介绍,总的感觉还不错。前一个版本的Zoundry只能在WYSIWYG下编辑,无法编辑HTML代码,这个版本的Zoundry填加了XHTML代码的直接编辑功能,并有方便的Validation功能,可以检查你的XHTML是否符合标准(有两个标准:transitional & strict ),另外还有其他几项比较大的变动:

  • 重新设计的用户界面:改进了编辑页面的布局,有了不少比较方便的小改进,譬如鼠标右键直接可以设置图片的摆放,blog列表添加按照时间排序、名称排序等功能,可以方便的链接到自己以前写的blog等等;
  • 帐户设置的改进:改善了对Drupal的支持,完全自动的对Drupal进行设置,支持各种Drupal Node Type
  • XHTML编辑:自动填充标签等等;
  • 支持控制Teaser:类似在drupal中使用的<!--break-->,可以方便的控制Teaser

等等等等,自己去发掘一下吧。BTW,这篇帖子使用Zoundry同时在我的blog与Drupal China发表,省了不少力气啊:)

Blog分类: 

玩转Drupal主题(1):解放 $links

在Drupal的主题中,控制一系列meta data显示的变量是$links,所谓的meta data也就是每篇post上面或是下面的“» read more | kzeng's blog | add new comment | 3 reads”这一行数据,有的时候,我们会希望把这个$links中的数据分开显示,譬如把“read more”放在一个比较显眼的地方,但是由于PHPTemplate并没有帮我们分别命名这些变量,所以无法直接来任意摆放这些它们。下面就介绍一个解放这些变量的方法,让使用者可以灵活的在主题中放置这些变量。

第一种方法是一种不彻底的解放,利用preg_match把$links中的每个一个数据都加上class,然后通过class来控制显示与位置(譬如用display:none;来隐去不必要的部分,用position来控制显示位置等等,但是这并不是彻底的解决方案。

第二种是修改Drupal的核心文件或是PHPTemplate Engine,一般最好避开这种方式,不然等到升级Drupal的时候就会比较麻烦,特别是如果隔的时间久了,你忘记了曾经做过哪些改动,升级时会出现意外,譬如我在升级到4.7的时候因为忘记了自己曾经patch过数据库中几个数据表的primary index的设置,导致升级时出现失败,还要在手动更改过来,所以一般来说修改显示最好的办法是修改主题文件,这样可以为将来省去不少麻烦,并且PHPTemplate的灵活性也使我们可以方便的修改Drupal的显示。

下面要介绍的这种方式是受到Drupal Handbook中关于提取“read more”的方法的启发,并主要来源于Nick的相关讨论。其最核心的部分是利用PHP中的preg_match来分离各个显示变量。在你的主题文件夹下新建一个Template.php文件,如果已经有这个文件则只需将下面的函数加在原文件的结尾。

Template.php 中新定义个显示变量的函数如下:
function _phptemplate_variables($hook, $vars) {
switch ($hook) {
case "node":
foreach ($vars['node']->links as $link) {
/*准备分离$links*/
preg_match("/]*).*?>(.*?)<\/a>/i",$link, $matches);
/*用preg_match替换,注意更改上一行的那个全角的?,因为我的codefilter错误分行才把它改成全角的,应该是半角的*/
$textparts = explode(" ", $matches[2]);
$urlparts = explode("/", $matches[1]);
$linkurl = $matches[1];
$default_title = $matches[2];
/*分离定义新的变量*/
switch (true) {
case in_array("blog", $urlparts):
$linktitle = $vars['node']->name."'s Blog";
$bloglink =
''.$linktitle.'';
$feedlink =
'
.'" class="feedlink">RSS
';
$vars['bloglink'] = $bloglink ." | ".$feedlink;
break;
case in_array("forward", $urlparts):
$stylecodename = "emaillink";
$linktitle = "email page";
$vars['emaillink'] =
'
.$linkurl.'" class="'
.$stylecodename.'">'
.$linktitle.'
';
break;
case in_array("comment", $textparts):
case in_array("comments", $textparts):
$stylecodename = "commentlink";
$vars['commentlink'] =
'
.$linkurl.'" class="'
.$stylecodename.'">'
.$default_title.'
';
break;
case in_array("read", $textparts):
$stylecodename = "readmorelink";
$vars['readmorelink'] = ''.$default_title.'';
break;
case in_array("printer", $textparts):
$vars['printlink'] =
'Print Page';
break;
default:
$vars['otherlinks'] .= ''.$default_title.'';
}
}
}
break;
}
return $vars;
}
?>

这样你就有 $readmorelink, $commentlink, $printlink 等多个变量可以使用了,在node.tpl.php中只需

即可。

注意:我在没有汉化的Drupal中使用这种方式成功,在汉化过的Drupal中,preg_match可能找到是汉语的string(我猜测),或者应该加上t()吧,呵呵,有空再研究一下:)

Blog分类: 

是谁在鼓励 Blog Spammer?

是Google。

Spam一直是Blog比较头痛的问题。虽然各种各样的模块与过滤器可以非常有效的控制Spam,但是稍一不留神就会有新的评论或是Trackback Spam冒出来,有时像雪崩一样,瞬间冒出一百多条Spam。正是因为如此, 一些比较Popular的blog譬如Boing Boing,已经不再允许让访客直接留下评论,而是通过Technorati的backlink来实现评论的功能,这一点与Google的Blog比较相似,唯一不同的是Google的Blog用的是自己的blogsearch的backlink。通过这种方式虽然有效的制止了Spam,但是无疑也为用户留言制造了麻烦。举个例子,直接的留言系统好比朋友或是熟人直接照面打个招呼,而backlink式的评论却好比熟人想打个招呼还必须规规矩矩的写信,并且这信还不一定投递的到,因为你首先需要Technorati或是blogsearch收录你的blog(注意:书信的格式还有要求,必须是blog,通常还必须是主流blog,否则blogsearch等未必会买你的帐,icerocket现在还拒绝承认我的blog :< 不过还比较庆幸的是现在blog搜索的主流是Technorati与google的blogsearch,而drupal对于这两者还是很友好的。)呵呵,如果blog不能直接评论,那么blog还能作为web 2.0 的代表之一么?或者这样无法评论的blog还是blog么?用乔治华盛顿大学一个政治学教授的话说,这样的blog"[is] just a glorified press release",譬如一些美国国会议员的"blog"。都是由于Spam的存在,很多流量较大的blog却不得不使用上述间接的留言方式,而造成这种局面的一个重要因素是因为Google。

或者更准确的说是以Google为代表的搜索引擎。与垃圾邮件不同,blog spam还有另外的一个目的就是获得更高的pagerank,从而在搜索引擎的搜索结果中脱颖而出。Six Apart的VP

The prime actor that made this behavior [指Spamming] valuable was Google, which created economics around links. Links on the Web have almost direct monetary value because of Google's PageRank system.

不尽如此,Google还默认blog中出现的链接的价值要比一般网站上出现的链接的价值要高,这更鼓励Spammer。虽然这并非Google的本意;虽然Google也在使用"nofollow"等trick防止spam,但是Google的搜索算法确实鼓励了这种做法,也算是一个unanticipated consequence吧。这两天看新闻,看到Google花了大价钱买了新的搜索算法,呵呵,不知道Google会不会改进它的pagerank的算法来杜绝blog spam.

Blog分类: 

升级到 Drupal 4.7-RC2与Blog演进史

今天 Drupal 推出了 4.7版的第二个Release Candidate,因为看到开发人员很自信的说这可能是正式版发布前的最后一个RC了,所以刚才升了一下级,从beta6 到 rc2的升级过程很平稳,因为没有数据库的改动,所以只需要替换一下文件就可以了,比从drupal 4.6.6到drupal 4.7-beta6的升级简单了很多,上次升级数据库的变动很大,为了顺利升级,还仔细写了升级步骤计划:)RC2修整了自RC1以来的很多bug,感觉比较明显的是我在用Beta-6时遇到的链接无法使用<front>指定的问题,RC2已经解决了。

在不断的升级过程中,也逐渐的剔除掉了越来越多的原有的CMS(内容管理系统)的特色从而增强了blog的特色。最初搭建这个网站的时候,因为中文Drupal的资料还是不是很多,再加上后来接受开始做Drupal的汉化,所以就启动了"论坛"模块方便大家交流关于Drupal的问题与心得,后来还做了一些关于Drupal的book,由于这些功能的存在,整个网站更像一个包括blog的cms而不是一个专门的blog,后来和大米一起搭建了Drupal China,有了专门的Drupal中文社区,所以我这里就没有必要再启用这些功能了,特别是Drupal China被Drupal列为正式的中文支持社区后,就更方便中文的使用者找到和使用这个网站了,昨天突然发现Drupal China的Page Rank已经是6了!中文网站PR是6应该也有不少,但是考虑到Drupal China才搭建不过一个多月,另外像新浪、搜狐、网易这些门户的PR也不过才有7,Drupal China已经算是很不错的了:)另外说句题外话,好像使用独立域名的中文blog好像很少有PR值到6的(主要指首页,某些单独页面的pr值可能到6),甚至连使用donews blog平台的keso的blogPR值也只有5,当然也不是完全没有,google的中文黑板报的PR值就是6,呵呵,也许这些数字说明不了什么,只是俺的职业习惯对数字比较敏感吧(特别是数字排序):)

也是因为有了Drupal China,所以我这里可以更加的blog化了,先是停用了论坛模块,然后取消了论坛的相关分类词,然后停止了这里一些关于Drupal手册的制作,然后更改了主题。原来由于cms的需要,不得不用三栏宽幅主题,后来虽然一再精简,还是为cms的结构所限制,而现在可以放心的使用两栏的主题了。同时也取消了首页链接上的"blog"链接,因为真个网站都是blog了,所以也没有必要再单列出这个导航链接。然后又利用drupal方便的内容管理批处理系统,把所有提升到首页的非blog文章都取消了"提升",也就是说在"首页"所能看到的就只有blog 帖子。一些旧的非blog的帖子可以通过搜索来查阅,譬如以前整理的一些有意思的转贴。不过还有一些非blog的东西被重点保留,譬如从中国地图出版社的BBS上整理出来的中国历史地图集,那里的论坛很不稳定,动辄就被关掉,现在又不知道为什么被关了,不过还好,尽管论坛不能访问了,论坛里的地图通过链接还是可以访问的,保留这样一份整理过的地图集链接,比较方便我自己还有一些喜欢历史的朋友读书时查询。还有就是一份历史年表,方便对比查阅公元纪年与传统历史纪年,曾经建议过Google除了加入节气日期查询外再加入历史纪年查询,不知道Google会不会有一天真的提供这项服务。

呵呵,总的来说,原来是一个包含blog的cms,而现在是一个有着某些cms功能的blog,这也正是Drupal的迷人之处。选择blog工具就像选一双合适的鞋,合脚是最重要的!:)

Blog分类: 

春天的新主题:春田花花

my new drupal theme 呵呵,为了庆祝春回大地,比划着Zen Garden的一个设计,为Drupal设计了一款新的主题,我称之为:春田花花。这个可与《春田花花同学会》无关,"春田"是我们这个塞北苦寒之地的首府(单于庭?^_^),借指俺这里;"花花"当然指的是春天了。按照老家的二十四节气,春分早已经过了,依历史传统,文人骚客们可以开始准备写诗哭春天了(贺方回哭着说:几许伤春春复暮),但是因为俺这里乃是弦歌毡乡之地,春天来得很迟,前几天还下了一场大雪,这两天才看到浅草吐绿,所以还是初春时节。第一次尝试完全用

制作主题,完全没有使用table,据说这样会更加的搜索引擎友好化

(SEO也不见得是一件好事情,以前刚夸完Drupal的SEO好,不到一个星期的时间,"冷饮"事件发生,俺的blog首当其冲的遭殃,事后搜索了一下那几个关键字,我的这里的搜索结果不管是在Google,还是百度上都排名在前5左右,sigh,怪不得殃及到俺呢)。另外,页面的设置也作了新的处理。Blog的页面摆放,几乎是前边一律的三种之一:无边栏(譬如,WordPress的一些经典主题),一个边栏(大多数Blog的主题),两个边栏(原先是一左一右,现在流行两个右边栏)。每种摆放都各有优劣。无边栏比较好保证了blog entry本身的整体性,但是罗列的信息较少;有边栏则有时又会影响到首页与单个blog entry的设置(特别是在有图片的情况下)。所以我这儿就做了一个折中,想读独立的主题与相对独立的边栏。这阵子正在研究Drupal的几个Ajax的应用,希望在以后的改进中可以更灵活的设置边栏。

另外,在这个新的主题中使用一些Drupal 4.7才的新特色。总的来说,Drupal 4.6的主题可以完美的用于Drupal 4.7,因为所有的升级工作都在PHPTemplate那里改进了,而PHPTemplate同时保证了大多数页面变量的一贯性。自Drupal 4.7 起,PHPTemplate的设置变得更为灵活,可以更方便的符合使用者的各种需要。另外这个也是对我还没有写完的drupal主题制作手册的一个暂时的交待,因为这个主题正是手册中做了一半丢在那里的那个:)

Free Tags: 
Blog分类: 

Druapl 4.7 使用手记 (3):灵活摆放block

Drupal 4.7 提供了更灵活的block摆放设置,除了原来的左右边栏,还可以把block摆放在页首与页尾。新的block摆放设置有一个优点与一个缺点。优点是事实上它可以把block摆放在页面(page.tpl.php)上的任何位置;确定是摆放仅限于于页面(page.tpl.php)而无法灵活的放置在node.tpl.php上,举个例子,譬如你想在每篇blog的下面通过freetagging的关联添加一个"相关blog文章"的block,利用Drupal的新的block系统,你只能把这个block摆放在评论的下面而通常所希望的评论的上面,free tags的下面,有些不方便。这里我就分别介绍一下Drupal 4.7的block的这两个优缺点,以及改进办法(以放置related nodes 为例)。

Drupal 4.7的block在设置中,除了左右侧边栏外,新添加了页首,页脚和内容三个位置的摆放,使得block的放置更为灵活。其实,block的摆放并不仅限于这三个地方,通过设置方便的PHPTemplate主题,我们可以方便的把block放在任意的地方。首先,针对left, right, content, header, 和footer这5个位置,他们对应的变量分别是 $sidebar_left, $sidebar_right, $content, $header, 和 $footer_message。也就是说在page.tpl.php中,你只要想在显示他们的地方是用 <?php print $变量名称; ?> 就可以了。譬如,你可以把 $sidebar_left 放在右边而不是左边(使用两个边栏都在右侧的外观主题)。除此以外,你还可以方便的定义自己的区域。

在你的主题文件夹里看看有没有template.php文件,如果有你需要将下面的代码添入,如果没有则需要新建一个template.php文件。在这个文件中我们将利用mytheme_regions() 来创建新的block的位置(参看Drupal使用手册的这里)。譬如你想在Drupal已有的block摆放区域外新建一个用来放Ad Sense的floater区域,只需要在template.php文件中写入以下代码:
function regional_regions() {
return array(
'floater' => t('floater'),
'left' => t('left sidebar'),
'right' => t('right sidebar'),
'content' => t('content'),
'header' => t('header'),
'footer' => t('footer')
);
}
?>
注意:你需要把regional_regions()更换为 你的主题名称_regions(),譬如 pushbutton_regions()。

然后在page.tpl.php文件中,只需要在你希望显示这个新的floater区块的地方写入 即可。同时也可以方便的css文件中定义它的显示属性(譬如,float:right)。

但是这样的灵活摆放仅限于page.tpl.php,无法在node.tpl.php上使用,有时这会非常的不方便。所以为了在node上灵活的显示block,我们有两种方式,一是在node.tpl.php上加入一段php代码显示block,但是并不推荐。另外就是大名鼎鼎,异常好用的flexiblock了,原来的作者没有推出 4.7的版本,但是有人帮助升级到了4.7(这里)使用方法与以前类似,是针对node.tpl.php的,正好可以与drupal的block摆放互补不足。有了这个模块,就可以方便的摆入“related nodes”block,用free tags重现awtags的方便之处,我这里就是一个范例。:)

Blog分类: 

Druapl 4.7 使用手记(2):使用Zoundry书写Blog

<

p>

呵呵,这一篇其实是一个篇外篇,本来不打算再写Zoundry的,因为以前写过;但是Drupal China有不少相关的讨论,所以写一下使用手记,使用Zoundry这么久也多了不少新的经验。以前在介绍过Performancing之后,曾经写过一个Zoundry和Performancing的简单的比较,Performancing的优势在于轻便;Zoundry的优势在于全面。这里主要说两个问题一是如何用Zoundry发布各个类型的Drupal的帖子(譬如Blog,Story,Page以及论坛主题);二是如何用Zoundry发布图片。

使用Zoundry发布帖子,必须先开启Drupal的blogapi模块,在开启这个模块之后,进入 管理->设置->blogapi,你就可以看到相关的选项,首先是选择使用哪种XML-RPC引擎,通常可以选用Movable Type;然后选择"Blog Type",如果只想用Zoundry发布blog,那么直接选"blog entry"就行了,如果还想用Zoundry发布别的内容,可以选择相应的类型,譬如论坛主题(Forum Topic)。在设置好Drupal的blogapi后,打开Zoundry,新建帐户,输入用户名密码,以及XML-RPC引擎的地址,通常是 http://www.yoursite.com/xmlrpc.php 就可以了,Zoundry会自动侦测可用的Node Type的。在我的测试网站,我就用Zoundry发布了一篇论坛里帖子。Zoundry可以很好的支持Drupal的分类系统,只需要在 Categories 栏里选择你要发布的论坛就可以了(呵呵,这就体现了Drupal论坛的好处,使用同样的分类词系统)。这也是Zoundry优于Performancing的地方,因为Performancing不支持blog以外的node type。

用Zoundry上传图片就更简单了,不用设置ftp的,直接使用"Use blog's upload feature (via xml-rpc)"这个选项就可以了。插入图片的时候图片会自动的生成缩略图,非常方便,这里是我发布的一个范例

呵呵,用Zoundry写blog非常方便,我现在基本上所有的blog都是用Zoundry写的(包括这篇)。但是它也有两个缺点,一是不支持freetagging,如果同时启用freetagging和分类,两者会混在一起;二是不支持Drupal的时区设置,我发布blog的时候必须把时间提前5个小时,不然时间是不对。希望在以后的版本里可以有所改进。总的来说还是很推荐Zoundry的:)

Technorati : , , ,

Blog分类: 

Druapl 4.7 使用手记(1):全新的 .install 文件

前天晚上把我的blog从 Drupal 4.6.5 升级到了 Drupal 4.7-beta6。总的过程还是很顺利的,升级的过程中也没有遇到"Illegal Mixing"的那个错误,看来 beta6 已经把它给修正了。因为自 Drupal 4.7 开始,数据库的编码都改为了UTF-8,但是升级程序只升级了核心的数据库文件的编码而并未升级一些模块使用的数据库文件(譬如:flexinode),所以这里就要用到 .install 文件了。

一般提供 4.7 版本的模块都应该在自己的文件夹里自带一个 .install 文件。这个文件有两个功能,一个是帮助安装新模块,一个是帮助升级旧模块(含数据库编码)。Drupal 原来的模块安装模式比较麻烦,如果模块必须相应的数据表支持,还必须再单独安装一遍数据表,自Drupal 4.7起,需要安装的数据表以函数的形式写入 .install 文件,直接和模块一起上传即可,在你第一次启动这个模块的时候,数据表会自动导入你的数据库,省去的单独导入数据表的麻烦。另外,再从旧的模块升级的时候,如果需要修改以有的数据表或是添加新的数据表也可以写入.install 文件,但是这个以我的经验是需要运行 update.php 来完成升级的(主要是更改数据库编码)。如果一个模块没有自带升级数据的编码文件,自己写一个也不是很难,可以参看这里这里是我给Flexinode模块写的升级 .install 文件

呵呵,这个新的功能还蛮好用的:)

Blog分类: 

升级到 Drupal 4.7-beta6 !

今天Drupal.org完成了到Drupal 4.7 cvs的升级,说明Drupal 4.7的可用性已经非常的高了,所以我这里今夜也升级到了Drupal 4.7-beta 6。整个过程还是有些繁琐的,包括把awtags转化为freetags,转换一些模块的数据表的编码,修正主题等等,现在基本已经完全完成,可能还会有一些小的bug,随后的几天慢慢的捕捉吧,如果你在浏览我的blog的时候发现有异常,也希望你能帮忙写一个comment:)具体的一些升级细节明天再写。诟病已久的 Drupal 4.7 的block摆放我也想到了一个比较好的解决方式,但是还没有来得及做,明天再改吧,呵呵,晚安!:)

Blog分类: 

Blog Network,Group Blog,DrupalChina: 构想

<

p>

Group Blog (或者 Community Blog)并未像很多人预想的那样如火如荼的展开,在中文Blog中尤是如此。一个比较熟悉的例子是维道,用参与者之一Maple的话说:"维道还是号称群组Blog的,可是越来越像二人转了……"。与此同时也有不少Blogger开始谈论Blog Network。那么Group Blog 与 Blog Network有什么区别呢?从形而上的角度看,感觉又是一个 群体主义相对于个体主义(Communitarianism v.s. Individualism) 的例子,[当然用Communisim (故意拼错的^_^) 更恰当一些,但是这个词的引申义太多,我现在还在隔离审查阶段,就不乱用不该用的词了],进一步说是以社区/群组(community/group)为单位与以个人(individual)为单位来组织blog的不同。Group Blog强调的是群体;而Blog Network虽然是一个Network,有些群体的含义,但是从根本上强调的仍然是个体的特色。强调群体并非坏事儿,但是真正的形成一个群体或是社区却很难,需要长时间的相互交流以及共同志趣的形成(呵呵,社会构建主义)。短时间拼凑起来的群体很难经得起时间的考验,因为任何集体行动,在没有内部化共同兴趣之前(这个就是所谓的构建),总存在着一个 collective action problem,简单的说就是一个和尚挑水吃,多个和尚没水吃,也就是前几天keso讨论的依赖自己还是依赖合作。举个例子,譬如几个人合作写一个Group Blog,如果几个人熟识,相互了解,兴趣一致,把这个Blog做好并不难;但是如果大家并不是很熟悉,兴趣又不大一致,时间久了难免会有推诿,于是群体很可能会蜕变为个体或是二人转。不仅如此,这样组织起来的群体也抹煞了个人的特色。而Blog Network 可以说是介于群体主义与个体主义一种方法,既保证了个体的特色,又使每个个体有对某个群体的归属感,从某种意义上体现了"人多力量大"。更简单的说,Blog Network是一个不冲淡个体特色的Blog群。

呵呵,以前也有过Blog Network的构想,并且注册到了 www. ourblogs.org 这个不错的域名,但是一致没有机会实施,所以就荒废在那里,等到哪一日又谁喜欢这个域名就转赠给他吧。现在就DrupalChina,其实觉得也可以非常方便的做一个Blog Network,这个Network并不要人来维护,可以利用Drupal的强大功能(主要是模块)来自动抓取自愿参与的个体blogger的相关blog,构成一个集合。现在DrupalChina,总体来说仍然是一个论坛,只是利用了Drupal强大功能的一小部分。本来打算首页模仿Drupal.org,翻译Drupal最新的新闻,但是由于很多内容(譬如在DC开会)与中文 Drupal 并不相干,所以意义不大。于是构想把默认的首页改为由Aggregator 2 自动生成的页面,即时从各个中文Drupal使用者的个人blog上抓取源于Drupal的blog,方便大家在一个集中的地方浏览Drupal最新的动态。同时也可以将Aggregator 2的主题做下适当的修改,使之看起来更像一个blog,现在有一个范例,就是部落格拉自由聚。呵呵,想试一下:)





Technorati : , , ,

Blog分类: