现在的位置: 首页 > 综合 > 正文

Drupal专业开发指南 第7章 Drupal节点(Drupal node)(1)

2014年03月05日 ⁄ 综合 ⁄ 共 4487字 ⁄ 字号 评论关闭

                                           
Drupal
节点

             
译者:老葛  ESKALATE科技公司

                        

 

在本章中,我们将介绍节点和节点类型。我们将向你展示创建一个节点类型的两种不同方式。首先,我们将向你展示程序解决方案,使用Drupal钩子函数编写模块来创建节点类型。在定义节点可以做什么不可以做什么的时候,该方式具有更高的自由度和灵活性。接着,我们将向你展示如何通过Drupal后台管理接口来创建一个节点类型,并简单的讨论了内容创建工具模块(CCK),Drupal社区正在慢慢的将CCK的方式添加到Drupal核心中去。最后我们将研究一下Drupal的节点访问控制机制。

 

那么什么才是一个节点呢?

对于刚刚接触Drupal开发的新手来说,最先遇到的问题之一就是,什么是节点?一个节点是一内容片段。Drupal为每一片内容指定一个名为“节点
ID
”(在代码中接卸为$nid)的数字ID。一个每个节点还拥有一个标题,从而允许管理员通过标题查看的内容。

 

注意:
如果你熟悉面向对象的话,那么你可以把每个节点类型看做一个对象,把每个节点看做一个对象实例。然而,Drupal的代码不是100%面向对象的,为什么这样呢?下面是一个很好的解释。(参看http://api.drupal.org/api/HEAD/file/developer/topics/oop.html)。

 

有许多不同的节点或节点类型。常见的节点类型有”blog entry”,”poll”,和”book page”。一般情况下(在本书中),术语“内容类型”和“节点类型”是同义的,尽管节点类型是一个更抽象的概念并且你可以把它看做容器,如图7-1所展示的。

 

7-1 基于基本节点的节点类型和可能添加的字段

 

   
把所有的内容类型当作节点的好处是,这样它们就可以基于相同的底层数据结构了。对于开发者来说,这意味着你可以对所有的内容以同样的代码方式进行许多操作。可以在节点上非常容易的进行一组操作,并且你也可以为你自己的节点类型添加许多额外的功能。由于所有的内容都是节点,所以Drupal内置的支持了对内容的搜索、创建、编辑和管理等操作。该一致性对于终端用户也同样明显。由于创建、编辑和删除节点的表单拥有一个类似的外观,这样就保持了一致性和更好的接口易用性。

 

节点类型通常通过为它们添加自己的属性来扩展基本节点。节点类型poll存储了投票相关条目,如投票的过期日期和投票人。节点类型book为每个节点存储了父节点ID,这样它就可以知道自己在表book的记录中的位置。节点类型blog,则与前面二者不同,它没有添加任何的其它的数据;替代的,通过为每个用户创建日志和为每个日志创建RSS种子,从而为数据添加了不同的试图。所有的节点都包括存储在表node和node_revisions中的下列属性:


nid:节点的唯一标识ID。


vid:节点的唯一修订本ID,由于Drupal需要为每个节点存储可修订的内容,所以该字段是必须的。在所有的节点和节点修订本中,vid是唯一的。


type:每一个节点都有一个节点类型;例如,blog,
story,
article,
image等等。


title:节点的标题,短的128位字符的字符串。如果通过代码将表node_type中的字段has_title设置为0的话,那么就没有标题了。


uid:作者的用户ID。默认情况,每个节点都有一个唯一的作者。


status: 0表示未发布;就是说,不具有权限“administer nodes”的用户看不到内容。1意味着已发布,并且内容对于具有“access content”权限的用户是可见的。Drupal的节点级别的访问控制机制(参看hook_access())可以禁止已发布节点的展示,如果启用了搜索模块,那么可以使用搜索模块来对内容建立索引。


created:节点创建时的Unix时间戳。


changed:节点最后被修改的Unix时间戳。如果你是用了节点修订系统,那么它的值与表node_revisions中字段timestamp的值相同。


comment:一个整数字段用以描述节点的评论状态,拥有3个可能值:

0:对当前节点禁用了评论。这是评论模块启用时的默认值。

1:不能再向当前节点添加评论了。

2:可以查看评论,并且用户可以创建新的品论。评论模块负责控制着谁可以创建评论以及评论展示的外观。


promote:另一个整数字段,用来决定是否将节点发布到首页上,有两个值可用:

1:发布节点的同时将节点展示到你站点的首页。这里需要注意的是,由于你可以将首页改成你想要的那个页面,这里可能有点用词不当。更准确一点的说,页面http://example.com/?q=node将包含所有的字段promote为1的节点,而该页面在默认情况下为站点的首页。

0: 不将节点展示在首页
http://example.com/?q=node.


moderate:一个整数字段,其中0表示仅用了moderation,1表示启用了moderation。下面是该字段的警告说明。在核心Drupal安装中没有为该字段留下接口。换句话说就是,你可以反复的改变该字段的值,而它默认情况下不起任何作用。所以开发者不要使用该字段来开发任何功能。在以前的Drupal版本中,该字段在核心代码中起到很大作用。


sticky:当Drupal在一个页面展示一列节点时,默认情况是将标记为sticky的节点列在前面,接着按照创建日期列出剩下的“unsticky”节点。换句话说就是“sticky”节点位于节点列表的顶部。1表示sticky,0表示unsticky。你可以在同一列表中包含多个sticky节点。

 

如果你是用了Drupal的修订系统,Drupal将创建一个内容的修订本来追踪谁最后修改了节点。

 

不是所有的东西都是节点

用户、区块和评论不是节点。这些特定的数据结构中的每一个都拥有它自己的钩子系统以适应它的特定目的。节点一般有“标题”和“主体”两部分,而代表用户的数据结构中则不需要这些。用户需要的是,e-mail地址、用户名称、一种安全的存储密码的方式。当要存储的内容片段更小一些时,比如存的时导航菜单、搜索框、罪行评论列表等等,我们此时使用轻量级的存储解决方案---区块。评论也不使用节点来保存它们轻量级的内容。一个页面可能会有100或者更多的评论,试想,如果所有的这些评论都使用节点钩子系统的话,那么会给系统带来多大的负担呢.

   
在过去,经常争论,用户或评论到底应不应该归结为节点。如果现在再提起这样的问题的话,就好比在编程风格上高呼“Emacs更好”一样。(译者注:我不知道Emacs什么意思^_^)。

 

创建一个节点模块

传统上,当你想在Drupal中创建一个新的内容类型时,你应该编写一个节点模块来负责提供你的内容类型所需的新的且有趣的东西。我们说这是传统方式,这是因为Drupal框架最近常用的方式是允许你通过后台管理接口来创建内容类型,使用第3方模块来扩展这些内容类型的功能,而不是从头开始编写一个节点模块。在本章中,我们将讨论这两种方式。

   
让我们编写一个节点模块,从而让用户可以为站点添加笑话。每一个笑话都包括一个标题,笑话本身,接着是一个笑话妙语(punchline)。你应该可以非常容易的使用内置的节点属性title来存储笑话的标题,用节点属性body来存储笑话内容,但是你还需要创建一个新的数据库表来存储笑话妙语。下面是数据库元数据:

CREATE TABLE joke (

nid int unsigned NOT NULL default '0',

vid int unsigned NOT NULL default '0',

punchline text NOT NULL,

PRIMARY KEY (nid,vid),

UNIQUE KEY vid (vid),

KEY nid (nid)

);

 

   
你存储了节点的ID,这样你就可以引用保存了标题和主体的node_revisions表中的对应节点了。这里使用了列vid,这样你就可以使用Drupal内置的节点修订控制系统了。当你编写对数据库进行更新操作的代码时,你就会看到如何使用它了。

 

   
首先,让我们在目录
sites/all/modules/custom下面创建名为joke的文件夹。

 

创建.install文件

由于你已经知道了数据库的元数据,让我们继续,创建joke,install文件并将其放到目录sites/all/modules/custom/joke下面。参看第2章以获取创建安装文件的更多信息。

<?php

// $Id$

/**

* Implementation of hook_install().

*/

function joke_install() {

switch ($GLOBALS['db_type']) {

case 'mysql':

case 'mysqli':

db_query("CREATE TABLE {joke} (

nid int unsigned NOT NULL default '0',

vid int unsigned NOT NULL default '0',

punchline text NOT NULL,

PRIMARY KEY (nid,vid),

UNIQUE KEY vid (vid),

KEY nid (nid)

) /*!40100 DEFAULT CHARACTER SET UTF8 */ ");

break;

case 'pgsql':

db_query("CREATE TABLE {joke} (

nid int unsigned NOT NULL default '0',

vid int unsigned NOT NULL default '0',

punchline text NOT NULL,

PRIMARY KEY (nid,vid),

UNIQUE KEY vid (vid),

KEY nid (nid)

)");

break;

}

}

/**

* Implementation of hook_uninstall().

*/

function joke_uninstall() {

db_query('DROP TABLE {joke}');

}

 

创建.info文件

让我们在创建一个joke.info文件并将其添加到joke文件夹下。

; $Id$

name = Joke

description = Provides a joke node type with a punchline.

version = "$Name$"

 

创建.module文件

最后,你需要创建模块文件本身。创建一个名为joke.module的文件并将其放到sites/all/modules/custom/joke下面。接着,你可以在模块列表页面(Administer
Site building
Modules)启用这一模块。你首先添加如下代码:

<?php

// $Id$

/**

* @file

* Provides a "joke" node type.

*/

 

 

抱歉!评论已关闭.