[2009/04/16]发布《Drupal项目实战-公司订餐系统(四)》本博客内容均为原创(Original),如有雷同,纯属巧合。转载请注明出处。同时欢迎学术探讨与批评。

2009年2月26日星期四

Disable user language模块介绍

今天给大家介绍一个新模块:DUL ( Disable user language : 关闭用户语言选择)。

在开启了Local模块后,Drupal即可以支持多语言界面了。同时,也使用户可以在Account中修改他所需要的语言界面——Language Settings。不过,在很多情况下,比如做国内的网站,并不需要用户选择“英文”界面,因为有很多情况下,界面中的文字是直接用中文写的,如果用户切换到英文界面,就会很“ugly”。当然,我们还是提倡大家尽量用t()写更“国际化”的界面。

这时,我们就需要DUL模块了。开启它后,它就将user/edit中的Language Settings部分去掉了,用户只能使用网站的默认语言。

DUL模块的下载地址为:http://drupalmodules.com/module/disable-user-language

2009年2月21日星期六

使用Drupal 6 Form API上传文件

在Drupal 6中,上传文件的函数与Drupal 5中的File Interface是有不同的。在Drupal 5中,上传文件使用的是file_check_upload函数;而在Drupal 6中,这个函数被取消了,换成了file_save_upload函数。
file_save_upload($source, $validators = array(), $dest = FALSE, $replace = FILE_EXISTS_RENAME)下面对每个参数作简要说明:

$source:自定义表单中,上传组件的名称。我在开发时,在这个参数上花费了不少时间,下面是手册中的解释:
$source A string specifying the name of the upload field to save.
我开始一直把upload field看成了upload file,以为这个函数传递的是文件名,因此始终不能上传成功。最后去include/file.inc的源文件中读源码,才发现了这个问题。因此提醒大家,不要误以为传递的应是文件名。

$validators: 用于检查上传文件的回调函数数组,元素就是函数名。这样使用:array('validate_upload' => $arg),其中$arg是你要传递给自定义检查函数的参数。
$dest: 上传文件的最终存放地址。Drupal有一个file_directory_path函数,用于返回当前Drupal的文件目录,如sites/default/files。
$replace: 指明如果上传的文件与现有文件重名,是否进行覆盖。如果不覆盖,则由Drupal自动重命名为filename_0, filename_1这样的文件。

下面给一个具体的示例,这是在drupal.org 找到的一些代码,然后我自己测试通过了。在使用之前,需确保files目录可写。
function my_form()
{
$form['upload'] = array(
'#type' => 'file',
'#title' => t('Upload your file:'),
'#size' => 40,
);
$form['#attributes'] = array('enctype' => "multipart/form-data");
$form['submit'] = array(
'#type' => 'submit',
'#value' => t('Save'),
);
return $form;
}

function my_form_submit($form, &$form_state)
{
$dest = file_directory_path();

if($file = file_save_upload('upload', array(), $dest))
{
$a = t('The attached file was successfully uploaded');
drupal_set_message($a);
}
else
{
drupal_set_message(t('The attched file failed to upload. Please try again'));
}
return;
}

2009年2月20日星期五

使用Firefox的GreaseMoneky插件

今天在写Blog时,发现Blogger的编辑页面中的编辑框实在是太小了。便能过Firebug把其高宽都调了了调,很好用。不过下次再用时,还要用Firebug来调,很麻烦。我记得有一个Firefox的Add-on叫Better Gmail,它是用本地的脚本去定制Gmail的样式,给我了点灵感。我马上就找到了Better Gmail所使用的核心插件——GreaseMonkey。

GreaseMonkey插件主要是可以让浏览器的使用者自定义网站的样式,或执行javaScript脚本。这样,我只需创建一个js脚本(GM是以.user.js为结尾的文件),然后使用GreaseMonkey设置,将进入Blogger的编辑页面时载入,就可以了。我写的脚本如下:

function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}

addGlobalStyle('#richeditorframe { height:500px ! important; } #modebar, #richeditorframe, #richbars, #editarea

{ width: 1000px }');
感兴趣的朋友们可以试一试。

2009年2月5日星期四

Drupal论坛简介

Drupal自带有“论坛”的功能,相信国内的广大Drupal使用者对Drupal自带的这个论坛功能也很感兴趣。但是,质疑声也是此起彼伏。很多开发者认为Drupal的论坛很不适合国人使用,因为其功能较为简单,且操作方式等也不太方便。那么Drupal论坛的特点是什么?究竟在哪种项目中适合使用Drupal的论坛呢?本文将引领大家简要了解Drupal的Froum,分析其适用场景及使用方法,并给出我的看法。

引言

Drupal的Forum模块是核心可选模块,开启Taxnomy和Comment模块后即可以使用。Drupal官方认为这个Forum像phpBB那样的message board。核心功能就是:

  • 用户就某一主题进行讨论
  • 把用户的讨论进行归档收集

这是Drupal论坛的设计宗旨,知道这两点可以便于设计者决策在实际项目中是否采用Drupal论坛。通常的情况下,客户们只说:我要一个论坛。但他究竟要的是什么样的论坛?主要的功能是哪些?这都需要详细的确定才行。比如下面两个客户对论坛的需求是截然不同的: 

客户甲:我需要一个简单的供用户交流的地方即可。论坛可以分为几个部分:产品讨论、使用交流和客户服务。嗯....只需要简单的发帖回帖应该就可以了。
客户乙:我们要打造全宇宙最酷最棒的论坛。论坛功能要炫!论坛版块要又多又全,用户互动性和可玩性要强,什么金币啊、等级啊、荣誉啊,一个都不能少!还可以互相买卖帖子,可以发不到一定等级就不能浏览那种帖子。积分功能要全,根据积分等级还要分什么虾米、大侠等,总之就是:炫!另外,由于用户至少同时在线100万,每个子论坛至少要支持10个以上的版主......

的确,第二个客户的需求有些夸张,存在的可能性也微乎其微。不过从这两个客户的需求上可以看出,虽然他们要求的都是一个“论坛”,但预期还是很不同的。前者需要的是论坛的基本功能,而后者则需要一个非常完整而复杂的论坛”系统“。那么结合Drupal Forum的特点,我认为,Drupal Forum比较适合前一类客户的需求。也就是说,Drupal Forum比较适合作为一个网站的支持社区,而不是作为主体功能。 

当然,我并不是说Drupal的论坛过简,由于Drupal强大的扩展性,我们可以自定义模块来进行论坛功能的增强。不过要在动手之前看看成本是否可以接受,还要考虑性能方面等问题。这也主要通过测试来考量。

Drupal论坛的组织结构

Drupal论坛由Forum和Container组成。前者就是我们熟悉的论坛单元,比如论坛分为“国内讨论”、“国外讨论”等,这些都可以创建为Forum。Forum还可以无限的嵌套,也就是有子论坛。而Container只用于对Forum进行分组和归类,用户不能在Container内发表主题。Container也是可以嵌套的。Drupal以这种方式组织论坛很容易让国人费解,其实只要一种Forum就可以了。 下图为Container和Forum的层次结构图。

我推荐的方式是这样的:最低层的论坛使用Forum,而其上的各种分类都使用Container。这样可以让用户只在最低层的论坛里发主题,就避免了在某个大类的论坛里发主题,好处就是在进行论坛主题归检索和显示时,大大提升检索效率。

为什么使用Drupal论坛

我认为使用Drupal论坛的原因很简单:它可以与其它网站的用户服务紧密的联系在一起,并可以利用Drupal的模块架构来进行功能扩展。Drupal是一个整站的框架,其中可以包含各种内容发布的功能,如博客、相册和论坛。那们,使用Drupal自带的论坛,可以有机的将这些功能整合在一起,给用户提供完整一致的使用体验。另外,对于计算用户贡献(如积分等制度)也是非常方便的。如果单独使用专门的论坛,如phpBB和Discuz等,如果很好的将论坛与Drupal站点相结合,就成为了一个不小的问题。而且由于目前还没有一个统一的标准来实现异构程序之前用户信息的同步,因此,使用Drupal构建的站点要使用论坛的话,最好的方式还是使用Drupal自带的Forum功能。

我曾经尝试过使用Discuz作论坛,来和Drupal集成,不过效果很不好。可能一方面因为我没有掌握Discuz的UCenter,另一方面我觉得UCenter还需要完善其API,使其更好用,而且文档和示例应该更全面一些。

常用的扩展模块

Drupal还是有很多关于Forum的模块的,比如最著名的当属Advanced Forum(简称AF)了。它的主要功能是使Drupal Froum看起来更像Forum,而不是简单的将节点和评论组织起来。比如它会将帖子的样式更改为:左侧是发表者头像和是否在线等信息,右侧为主题帖的内容。不过它的安装稍显复杂,而且目前针对D6还没有稳定的版本。

除此之外,还有一些模块可以起到辅助作用,如User Point模块可以使论坛具有积分系统,User Stat模块可以获取用户的一些注册日期、发帖数量等,用于计算用户等级并定制显示等。

示例

用事实说话,才会使人信服。我看过一些Drupal Forum搭的论坛,感觉不错的确实有几个,比如The Webmaster Forums(http://www.webmaster-forums.net),下面是一些截图,可供参考。
  
总结

简单的说,喜欢欧美风格的朋友们应该比较适合使用Drupal Forum。不过, 好不好用,还要用户说的算。以上只是我的个人观点,欢迎朋友们和我讨论。