drupal模块

分享扫描版古籍

手头有很多年积攒下来的扫描版古籍,很适合在 Kindle DX 或者其他足够大的手持设备已经电脑上看。昨天正巧有人让我帮忙找一下 1956 年中华书局版的《资治通鉴》,所以就顺便想了一下分享这些已经版权过期的古籍的方式(按照中国的著作权法,这些古籍应该不存在版权问题,因为作者都已经过世超过五十年)。以前试过用比较复杂(当然也比较方便)的 Biblio 模块,但是那个输入起来太费时间了,所以对于希望有一种方式可以:

  • 支持 FTP 批量上传
  • 支持简单的文件描述
  • 可以使用 drupal 的访问控制和角色控制
  • 和 drupal 本身的各种功能更好的整合

其实符合这些要求的 drupal 模块很多,实验了一下,最后决定用 filebrowser 模块,完全符合上述的要求,并且支持三种下载管理模式(公开,私下,安全)。另外,它直接把 directory listing 作为一种新的内容类型,很方便管理,所以暂时使用这个模块继续实验一下。

在 blog 的导航中加入了“古籍”,点击就可以进入古籍列表了,可以直接利用浏览器的搜索功能进行搜索,也可以通过本 blog 的搜索功能。FTP 上传很便捷,一会儿功夫就上传了 2.1 G 的 PDF。同时重写了列表的 CSS ,使它和 blog 主题的风格一致。为了防止 Unicode 的文件名导致在某些浏览器中不能下载,所有文件名都改为数字名称。另外在本地写了一个小程序,可以快速的更改文件名和添加文件描述。

以后会陆续添加更多的古籍到这个目录,选录古籍的基本标准如下:

  • 实体书扫描版(这样才能确保质量)
  • 以中华书局、商务印书馆等主要出版社为主(也是为了确保质量)
  • 古籍的原作者必须过世五十年(以符合中国的著作版权法)
  • 只收录 PDF 格式,其它格式譬如 .djvu等也会先转为 PDF 格式再上传(方便 Kindle 阅读)

试一段时间看看。

Blog分类: 

Views 模块教程(六):区块与 argument 的使用

通过利用 views 模块制作“按月归档”的页面和区块(block)来讨论一下 argument 的使用。Drupal 其实有按月归档这个模块,叫做 Monthly Archive , 是 Mars 做的,不过用 views 模块实现这样的功能也不难。我的 blog 的侧边栏就是一个实例,点击 “blog 归档” 下面的“更多”就可以进入按月归档的页面,看到所有 blog 内容的档案。

开工。 在 views 的管理界面下点击“add”标签,添加新的视图。名称是 Archive ,给所有的访客访问的权限,描述随意。然后“页面”项下选择 provide page view,提供页面视图, url 按照惯例是 archive。 viwe type 随意,我这里选择的是习惯的 teaser list,标题“按月归档”。使用 pager (分页)。其它的默认即可。

然后在“区块”项下选择 provide block,提供区块。view type 考虑到是在侧边栏现实,所以选择 List view (列表显示)。区块的标题“Blog 归档”,你想继续叫“按月归档”也行。一个区块现实的页面链接数,5 个。然后选择 [more] link。

Fields项下,只需要添加一个字段(field),Node:Title。Option 设为 As Link,不可sort。这里定义的是最基层的视图的显示,譬如这个链接下的显示:http://www.kzeng.info/archive/200704 。

过滤器项下,第一个过滤器, Node: Published 只选择发布的内容;第二个过滤器, Node: Type 只选择 Blog entry ,当然你可以按照你的需要选择显示的类型。

Sort项下选择 Node: Created Time 按照降序排列。

最后让我们来看 argument 项,这个argument实际上提供了按月归档的列表,是高一层的视图,这里选择 Node: Posted Month + Year ,然后 summary, sorted descending,标题“按月归档”。搞定。简单的说,这个 argument 帮助生成了子页面的链接,非常的方便。

按月归档的页面可以在 yoursite.com/archive 下访问,而相应的区块需要在区块管理中启用。你可以适当的更改 CSS 来美化这个列表。

下面的是导出的 views 的代码,可以直接导入 views 管理中使用和研究。

 $view = new stdClass();
  $view->name = 'Archive';
  $view->description = 'Monthly Archive';
  $view->access = array (
  0 => '1',
  1 => '2',
);
  $view->view_args_php = '';
  $view->page = TRUE;
  $view->page_title = '按月归档';
  $view->page_header = '';
  $view->page_header_format = '4';
  $view->page_footer = '';
  $view->page_footer_format = '4';
  $view->page_empty = '';
  $view->page_empty_format = '4';
  $view->page_type = 'teaser';
  $view->url = 'archive';
  $view->use_pager = TRUE;
  $view->nodes_per_page = '50';
  $view->block = TRUE;
  $view->block_title = 'Blog 归档';
  $view->block_header = '';
  $view->block_header_format = '4';
  $view->block_footer = '';
  $view->block_footer_format = '4';
  $view->block_empty = '';
  $view->block_empty_format = '4';
  $view->block_type = 'list';
  $view->nodes_per_block = '5';
  $view->block_more = TRUE;
  $view->block_use_page_header = FALSE;
  $view->block_use_page_footer = FALSE;
  $view->block_use_page_empty = FALSE;
  $view->sort = array (
    array (
      'tablename' => 'node',
      'field' => 'created',
      'sortorder' => 'DESC',
      'options' => 'normal',
    ),
  );
  $view->argument = array (
    array (
      'type' => 'monthyear',
      'argdefault' => '5',
      'title' => '按月归档',
      'options' => '',
      'wildcard' => '',
      'wildcard_substitution' => '',
    ),
  );
  $view->field = array (
    array (
      'tablename' => 'node',
      'field' => 'title',
      'label' => '',
      'handler' => 'views_handler_field_nodelink',
      'options' => 'link',
    ),
  );
  $view->filter = array (
    array (
      'tablename' => 'node',
      'field' => 'status',
      'operator' => '=',
      'options' => '',
      'value' => '1',
    ),
    array (
      'tablename' => 'node',
      'field' => 'type',
      'operator' => 'OR',
      'options' => '',
      'value' => array (
  0 => 'blog',
),
    ),
  );
  $view->exposed_filter = array (
  );
  $view->requires = array(node);
  $views[$view->name] = $view;

Blog分类: 

Views 模块教程(五):标签实例

继续我们解剖 tracker 视图的教程。我们知道 Tracker 模块提供的 trakcer 视图,除了能显示所有的最新文章外,还能显示已登录用户的所有文章,这两项内容在 tracker 页面下的两个标签(Tab)中显示。 其实,views 模块可以方便帮助我们制作标签。首先我们创建“所有最新文章”标签下的视图。这个与我们在上两个教程中讨论的 trakcer 视图的设置基本相同,但是需要做一个小的更改,首先把 url 改为 tracker/all ;同时,按照习惯,把这个 views 的名称命名为 tracker_all。然后在 menu 项下勾选: provide menu; provide menu as tab; make default menu tab。这是在告诉 views 模块,这个视图提供菜单,菜单输出为标签,把这个标签当作默认显示的标签。

然后我们需要创建 “我的文章”这个标签,首先 url 设定为 tracker/mine (这个其实随意,你把它设定为 tracker/mypost 也可以),名称命名为 tracker_mine ,同样勾选 provide menu; provide menu as tab,但是不要勾选 make default tab,因为只能有一个默认的显示。此外,如果想控制两个标签的先后顺序,可以通过 tab weight 来设定。Tab title 填写为 “My Posts”。因为这个视图是只显示现在登入的这个用户的,所以我们要过滤掉其它的作者的文章,这就需要设定 filter 了,在 filter 那里新添加一个 Node: Author is Current User 把它设定为  "Is Equal to " "currently logged in user" 即可。然后保存。工作完成。

现在通过 yoursite.com/tracker 来访问你的视图,你就可以看到两个标签页面了,呵呵,很方便吧!

Blog分类: 

Views 模块教程 (四):解剖 (2)

Field 项是 views 模块的最终要部分,直接控制着输出视图的显示方式。一个典型的 tracker 页面由以下部分组成:

页面类型 标题 作者 回复数目 最新回复时间

可以参看 Drupal China 的 tracker 范例。所以,在 field 项里,我们需要做的就是按照需求选取字段 (field)。第一个要选取的就是 页面类型。在 Add Field 菜单中找到 Node:Type 点击添加,Node:Type 就出现在 field 项下了,然后我们要做一些设置, Label 就是这一项在列表中的显示名称,填入“页面类型”(英文版的 views 默认的是 Type)即可。Sortable 是设定是否按照这个字段排序,这里选择 no,如果选择 yes ,那么在 Default Sort 那里要选择默认的排序方式。

同样的,我们可以确定第二个 “标题”字段,添加 Node: Title 即可,在 Handler 设定下,我们选择 with updated mark,这样如果内容更新,标题上就会显示 “new”或者“”的标示。Option 设置为 “as link”,这样就可以生成链接了,注意,不是每个字段(field)都会有这样的 option,譬如 CCK 有一个辅助模块 Image Field,在views中并没有 as link 的选项,非常不方便,必须通过 patch 才能达到目的。

添加完所有的 field,工程就完成了大半了,每个字段的最右边都有操作的图标,你可以方便的上移或者下移以及删除这个字段。另外要注意的是,这里所有的 sortable 选项全部都是 No,这点对于网站的优化很重要,如果某个字段允许排序,那么访客在点击它的时候,事实上是对整个网站的内容进行排序,这样不仅慢而且浪费网站资源,但是如果不让字段排序,如何能做到显示“最新”文章呢?这个马上就要说到。

Field 项下是 Argument 项,在这里,不需要什么设置。

再向下是 Filter 项,它的作用是过滤掉你不想显示的内容,譬如这里,我们只希望发布的内容显示,所以我们添加 Node:Published 在 Operator 中选择 euqals (等于),value 中选择 yes。在你设计的任何试图中,通常都要添加这个 filter ,不然没有发表的内容也会被显示出来。注意,在filter 的右端还有一个 expose 选项,如果选择这个,那么这个 filter 就会变成 exposed filter ,也就是这个 filter 是“暴露”给访客的,访客可以使用这个filter 来过滤内容。

Filters 项下面就是 exposed filters 项,这里,你可以定义任何你向让访客使用的过滤器。

最后一项是 Sort Criteria,也就是排序标准,在这里我们可以设置默认的排序方式(这里设置排序的好处就是可以不把某个字段的属性设置为可排序,正如上文所述)。添加 “Comment: Last Comment Date”,order 设置为降序,option设置为 normal 即可,其他的option规定了时间选择的最小单位。

OK,到这里,整个 tracker 部分就讲完了,点击 mysite.com/tracker 是不是出现了最新文章的列表?呵呵,不过仔细一看,发现和tracker模块提供的tracker界面相比还了少些什么,对了,就是“所有最新文章”和“我的最新文章”这两个标签。我们现在用 views 做出的 tracker 只有所有的最新文章。如何在同一个页面添加不同的标签呢?下次再说:)

Blog分类: 

Views 模块教程 (三):解剖(1)

Drupal 的基本组成部分是 Node, 外加 Node 的附属 Comment。对于一般的使用者来说,Node 是不可分割的;即便是熟练的使用者,在使用 Node 的各个字段时也会觉得非常的麻烦,而 Views 就可以方便的解决这个问题,从 Node 中提取你需要的字段,按照你希望的方式展示,并过滤掉你不希望出现的内容,Views 的工作流程可以用下图表示:

在明白这个流程后,让我们来解剖一个 Views 的实例,使用的样本是 Views 模块自带的 Tracker 视图。Drupal 的 Tracker 通常是 Tracker 模块提供,可以通过 yoursite.com/tracker 来跟踪网站最新的内容。但是有了 Views 模块,我们可以在不启动 Tracker 模块的情况下实现 Tracker 的效果。

在视图(教程中的 views 暂译为“视图”)的管理界面,找到 Default Views 是 tracker, titile 是 Recent Post 的那个视图,点击后面的 “add”,进入编辑状态。

Basic Information 项下,设置名称,访问权限和描述。名称的设置参加教程(二),访问权限和描述按照惯例。

Page 项下第一个选项 Provide Page View ,当你希望输出的结果是页面是勾选这个选项;第二个选项 URL,则是设置访问这个页面的地址,理论上讲,你可以设置任何地址,但是记住,需要使用相对地址,并且首尾不要用 “/”。譬如你想把访问的地址定义在 http://mysite.com/new ,那么这儿,你只需要填写 new 就可以了。这里,因为是在模仿 Tracker 的效果,所以URL 的地址也设置为 tracker。注意,如果 mysite.com/tracker 这个地址是系统已有的(譬如你启动了 tracker 模块),那么你定义的视图会覆盖系统已有的显示方式。另外,这个 URL 可以使用通配符变量,也就是 $arg, 这个变量的定义在下面讲。再往下,View Type, 提供了五种常用的视图显示方式:全文,摘要,表格显示,列表显示,和显示 RSS。Tracker 模块提供的默认显示方式就是 表格显示,所以这里我们也选择 Table View。再接下来的 Title,就是这个页面的标题,这里我们的定义为 Recent Posts,注意这个标题也可以使用 $arg, 譬如你定义的是一个分类的显示页面,你希望这个页面的标题是分类的名称。再往下的,use pager 这个选项决定是否使用分页显示,当结果比较多的时候,建议选择这个选项,Breadcrumb trail should not include "Home" 这个选项决定你页面左上方路径的现实方式,是否包括“home”;Node per page ,如果选择了分页显是,这里可以定义每页显示多少个结果;Header Footer,如果需要可以输入相应的页首和页脚信息;Empty Text 是你定义的 Views 返回的结果为 0 时显示的内容,譬如你定义了某个 term 的视图,但是这个 term 下没有文章,那么你可以在这里定义返回的结果。一般使用默认就可以了。menu 选项,第一个选项 Provide Menu决定是否为这个页面定义一个菜单,要和紧接的 Provide Menu as Tab 配合使用。如果选择提供菜单,但是不作为 Tab,那么这个页面的连接就会在 Drupal 的主菜单系统中显示,也就是在边栏里的导航菜单中显示;如果选择作为Tab,这不在边栏中显示,而在页面的上方作为标签显示。如果作为标签显示,那么 Make Default Menu Tab 这个选项则是确定是否把现在这个视图作为这个路径地址的默认视图,因为存在标签,所以一个基本路径地址可能有不同页面,譬如 tracker 模块提供的页面中,上面有“最新文章”和“我的最新文章”两个标签,默认的显示“最新文章”这个标签,关于如何设置多 tab 显示的方式 ,我们以后还要讲到(在我们的第一个实例里),这里从略。Tab Weigth 用来调整 tab 的顺序;Menu Title 定义这个页面在系统菜单中的名称,如果什么都不填则默认值为页面的名称。

Block 项这里什么都不用设置,因为我们定义的是一个页面而不是一个block。block的定义方式和 page 差不多,不同的是输出的结果是 block 而不是 页面。

再往下就是最有趣的字段,$arg 和 过滤器设置了。我们下次再说:)

Blog分类: 

Views 模块教程 (二):概述

安装 views 模块就不多说了,和其他的模块一样,上传,启动,然后在 Administrater -> Site Building 下可以找到 views 的配置页面(如下图所示)。

最上面的标签分别对应着 列表 添加 导入 主题向导 工具。“列表”标签下列出了所有已创建的视图。views 模块自带了四个常用的视图,分别是:“最新评论”,“首页”,“分类词”和“最新文章”。如果你自己添加了新的视图,它们将会单独列出(如下图):

注意,views提供默认视图与你自己创建的视图是分开显示并且有不同的选项的。你自己的创建的视图有 编辑 导出 删除 克隆 等选择而默认的视图里只有 添加 停止/启动 选择。我们现在以第二幅图的第二个视图为例来解释一下各列的含义。

最左边的是“视图”(view, 因为它正好和 Drupal 翻译中的 view 重复了,所以才会在这里被自动翻译为 查看),如果你希望你的视图覆盖默认的视图,这一项非常的重要,注意它只能包含字母和下划线,通常,如果你想覆盖的路径是 taxonomy/term 那么这个名称就是 taxonomy_term;如果你想覆盖 node 那么这个名称就是 node。如果你重新创建的页面,譬如 characters/name ,那么就无所谓了,不过按照惯例,你可以命名为 character_name

接下来是“标题”,当进入你定义的视图时,“标题”就会自动出现在页面的上方;

然后是“描述”,这个主要是方便你自己,知道你定义的这个视图是什么,防止以后遗忘;

然后是“提供”(provides),选择输出的是 页面(page),区块(block)还是 菜单(menu)。如果输出的是区块,那么在定义过这个视图后你可以方便的在区块管理中找到你新定义的区块,如果是菜单,则会出现在菜单管理中,注意,在选择生成菜单的时候你可以选择“标签显示”,这样就可以生成标签,就像最上面的 列表 添加 导入 主题向导 工具 标签一样。

如果你输出的是页面,则在 URL 下显示的就是你的页面的地址,注意,它可以覆盖已有的页面,譬如例子里的 taxonomy/term/$arg ,这里的 $arg 是一个 argument,这里我定义的是 term 的 id,这样它就可以覆盖所有 taxonomy/term 下的显示方式,类似个通配符,把诸如 taxonomy/term/1 ; taxonomy/term/2 等等都按照我定义的方式来显示。

最后一栏是可以进行的操作,上面已经说的很清楚了。你可以利用编辑你创建的视图,导出你自己定义的视图,删除它,或者是复制一份。

今天先到这里,下一次具体剖析一个视图的例子,讨论一下每一部分的含义。

Blog分类: 

Views 模块教程 (一):简介

懒了很久,终于动笔写这个教程,α 版。

打个比方来说明一下 Views 的作用: Drupal 的核心就像一个毛坯房,墙窗户门都有了,也简单的粉刷过了,搬进来也能住;外观主题 (Theme)就像室内装修,可以按照自己的喜好来铺地板或是地毯,选择各种各样喜欢的墙纸(现在装修还需要墙纸么?hoho,俺对装修的概念还停留在10年前^_^)等等;模块呢,就好比家具,电器之类的,有了模块可以方便实现各种方便的功能,大部分模块都像冰箱电视一样,启动,摆在那里就行了,但是有些模块可以说是大工程,譬如 CCK,可以让你建设新屋子,有些是中等工程,譬如 views,它可以打掉你屋子之间的墙,改变屋子的格局,Drupal 的是建立在 node 上的,而views 的核心功能就是帮助你改变 node 的组织与显示模式。

举几个可能会用到 views 的例子:

  • 你希望首页的内容以不同的顺序显示。譬如不是按照从新到旧的顺序,而是按照“热门”程度(浏览次数,评论数目);
  • 你希望改变 taxonomy/term 的展现方式。当你点开某个 term 的时候,你看到的是这个 term 下内容的按照张贴顺修的列表,譬如你想改变这个列表的显示方式。默认的显示方式是“题目加摘要”,但是你希望它是以table的形式一目了然的显示所有必要的信息;
  • 你想用 /tracker 来跟踪最新的帖子,但是只希望某些类型的帖子显示(譬如,你的CMS站是销售某种产品的,你只希望在 tracker 中显示最新添加的产品,而不包括论坛的讨论贴)
  • 你想在区块(block)中显示某个分类下的最新的帖子;
  • 你想为用户现实“未读的论坛帖子”;
  • 你希望有一个类似“按月归档”的区块,可以方便访客按照时间来查询帖子;

如果你希望以上的功能,那么 views 模块是绝对必要的。这个教程大致按照如下计划书写,第二部分讨论如何试用一些“罐装”好的非常实用的 views 代码;第三部分举例说明写如何自己按照需要定制 views;第四部分讨论如何利用 views 和 cck 相结合,随心所欲的打造你需要的功能与现实效果。一言以蔽之,使用了 cck + views 之后,再加上一些简单的主题与css的技巧,基本上没有 drupal 仿造不出来的网站,也就是说你的毛坯房也可以改造为希尔顿:)

Blog分类: 

重新构建“相关链接”

每篇 blog 下面的“相关链接”可以方便的给blog读者更多的相关信息。在 Drupal 4.5 之前的年代,这项功能是通过 awTags 完成的,但是先在 awTags 已经湮灭了;在 Drupal 4.6 和 4.7 的年代,这项功能是通过 Flexiblock + Related Nodes实现的,但是现在这两个模块都停止更新了。所以在 Drupal 5.1 的年代,我们必须寻找其他的“相关链接”的解决方案,并且这个方案要“可持续发展”,不然过一段时间就要重头来过。于是这次就用 php codeRelated Links 解决了这个问题。着手解决这个问题其实可以分三步:1) 找到能生成相关链接的模块;2)想办法把生成的block摆在内容的正下方;3)CSS 美化。

Related Links 很好的解决了第一个问题,这个模块要比以前的 Related Nodes 更为强大,选项也更加丰富;而解决第二个问题就只能修改 node.tpl.php 了,加入现实 block 的代码。这样,就在每篇的 blog 的结尾根据 Tags 和 分类词自动生成了相关链接(事实上, Related Links和可以根据全文搜索来生成相关链接,不过担心这样会加重服务器端的负荷)。但是这些链接是单行排列的,比较长,所以就想把他们显示为通常的两竖行显示 ,这就需要 CSS 来控制,根据 A List Apart 上的这篇文章,可以很方便的利用 floating 属性生成双竖行的相关链接。最终得到了现在你看到的效果:)

Blog分类: 

Drupal 最新的 Update Status 模块

今天 Drupal 的Contributor们推出了一款非常实用的模块:Update Status。它通过 cron job 从 Drupal 总站的服务器端获取信息,可以检测你正在使用的模块是否有新的正式发布版。这样就大大的节省了站点维护的时间,不用经常的去查询已安装模块的升级信息了。同时,这个模块还在管理界面里直接提供了更新模块的下载链接,非常的方便。呵呵,据说这个模块会加入 Drupal 6.0 的核心模块中去。推荐安装一试。

Blog分类: 

使用 Captcha + TextImage 阻挡 Spam

Drupal的Spam模块虽然功能强大,但是其运作原理类似先将spam吃掉,然后再消化(先把spam甄别出来,设置为“未发表”状态,然后在运行 cron job 的时候将其删除),这样一来还是比较耗费资源,所以决定还是用 Captcha 模块。4.7 版本的 Captcha 模块重新做了调整,为了适应没有安装 GD 的用户使用,Captcha 将原有功能分解为两个功能:数字运算 Captcha 和 TextImage Captcha。所谓数字运算,就是说在留言时必须计算一道数学题,用来证明是真人在留言;而 TextImage 则和通行的Captcha系统一样,通过辨认图片上的字母来填写留言。后者需要同时安装一个单独的 TextImage 模块。呵呵,希望这下子可以更好的阻挡 Spam。因为用来 Captcha,所以决定暂时停止 Spam 模块,并且不再要求留言时填写 Email ,希望不给留言增加麻烦。

Blog分类: 

Pages