Drupal专业开发指南 第9章 Drupal区块(Drupal block)(1)

译者:老葛eskalate科技公司

 

区块是文本或者功能的一个片段,它通常位于一个网站的主内容区域之外,比如左栏,右栏,页首,页尾,等等。如果你曾经登录过一个Drupal站点,或者访问过一个Drupal的管理界面,那么你是用过区块。区块的访问权限和放置位置通过管理接口控制,它简化了开发者创建区块时的工作量,区块配置页面位于Administer Site building Blocks (http://example.com/?q=admin/build/block).

 

什么时候使用区块?

区块包含一个标题和一个描述,大多数用于代码片段和状态指示器,而不是用于包含各种信息的内容。因此,区块不是节点,它与节点有着不同的规则。节点有修改控制,完善的访问权限,附带评论的能力,RSS种子和分类词语,它们通常用于一个站点的主要内容部分,区块拥有选项用于控制谁可以访问它们以及它们出现在站点的哪些页面。如果启用了throttle(节流阀)模块,当访问量超过一定阀值时,一些不重要的区块,能够被自动关闭。区块列表页面如图9-1所示。

9-1,当节流阀(throttle)模块启用时,区块列表页面显示了节流阀(throttle)选项

 

可以通过Drupal管理接口创建区块(称作定制区块),也可以通过区块API用代码创建区块(称作模块区块)。当你创建区块时,该选用哪种方法呢?简单的区块,比如一个用于订阅邮件列表的表单,与站点相关的文本都适用于定制区块。区块如果与你写的模块相关,或者包含了大量的php代码,则使用区块API通过模块创建。由于代码存放在数据库中比写在模块中更难于维护,所以尽量不要在定制区块中使用php代码,一个站点的编辑可能对此并不了解,它可能会偶然的不经意间将大量工作轻易的删掉。进一步讲,如果使用模块创建区块过于笨重,而又不得不使用php代码时,仅仅在区块中调用一个定制函数,而将函数存放在别处即可。

注意,对于特定站点的区块和其它组件的一个常用经验,是创建一个站点特定的模块,将站点的定制函数放在里面

 

尽管区块API很简单,并且有一个单一钩子函数hook_block()驱动,但是在这一框架下,你可以做到你可能想不到的事情,区块可以展示你所想要的任何事情(这是因为,由于它们是使用php实现的,所以在功能上不受限制)。尽管如此,它们通常扮演一个对主内容进行支撑的角色。比如,你可以为每一个用户角色创建一个定制的导航区块或者你可以使用一个列出赞同评论的区块。

 

区块的配置选项

 

开发人员通常不需要担心区块的可视性,因为可以通过区块管理接口页面来处理大多数的情况。使用如图9-2所示的接口,在这些页面内,你可以控制下列选项:

区域位置:区域是区块在站点中放置的位置。通过主题来创建和显示区域而不是通过区块API,没有指定区域的区块不被显示。

 

特定用户的可视化设定:管理员可以允许个人用户在他们的帐号设置中定制特定区块的可视性。用户可以通过单击链接我的帐号来修改区块的可视性。

 

特定角色的可视化设定:管理员可以选择区块仅对具有特定角色的用户可见。

特定页面的可视化设定:管理员可以选择区块仅对具有特定页面或者范围内的页面的用户可见或者隐藏,或者当你的php代码返回值为真的情况下可见。

 

9-2 管理接口页面区块的配置选项截图

 

 

 

区块位置

 

我们前面提到,在Drupal的区块管理页面给站点管理员提供了区块出现在哪里的选项。在同一页面的同一区域内,他们还可以选择区块的出现次序,如图9-3所示。区域是通过主题层使用方法hook_regions()来定义的,而不是通过区块API,而且不同的区块可以有不同的区域,参看第8章可以获得关于创建区域的更多信息。

9-3一个区块可以放置的区域依赖于站点主题提供的区域。

 

 

定义区块

可以通过在模块中使用钩子方法hool_block()来定义区块,而且一个模块可以在同意钩子方法中实现多个区块。一旦定义好了一个区块,那么它将会出现在区块管理页面。另外,站点管理员可以通过后台接口手工的定义定制区块。在本节,我们主要关注通过代码创建区块。让我们看一下区块所涉及到的数据库表元数据,如图9-4所示.

9-4 区块的数据库元数据

 

每个区块的通用属性存储在表blocks里面,通过后台接口创建的区块的其它数据,比如它们的内容还有输入格式类型存放在表boxes里面。最后,表blocks_roles存放每一个区块的基于角色的访问控制权。以下属性在表blocks里面定义:

module:这一字段存放的是定义区块的模块的名称。比如,用户登录区块在用户模块中定义,等等。对于通过后台接口创建的区块,在这里都使用block(区块)模块,它们由区块模块创建。

delta:由于一个模块可以在钩子方法hook_block()中定义多个区块,那么delta存放了每个区块的键值。它们在钩子方法范围内是唯一的,但对于整个站点的所有区块则不一定唯一。通过后台接口创建的区块的delta字段,同时作为表blocksbid字段的主键。delta可以是整数,也可以是字符串。

theme:由于区块可以为多个主题定义,Drupal需要存放启用该区块的主题的名称。启用该区块的每一个主题在数据库中都有一行相应的记录。配置选项在主题间不共享。

status:它用来标识区块是否被启用。1意味着启用,0意味着禁用。如果一个区块。没有为其分配一个区域,那么Drupal将会将其状态设置为0.

throttle:当throttle(节流阀)模块启用时,该字段用于追踪哪些区块被节流阀控制。0意味着禁用,1意味着启用。节流阀模块能够自动的探测访问流量,当流量达到一定的阀值时,能临时的禁用一些区块(参看第22章,更多详情)。

 

理解区块的主题化

在一个页面请求周期内,主题系统向区块系统请求以返回每一区域内的一列区块,当为页面模板文件(通常为page.tpl.php)变量赋值时,完成这一步骤。为了聚合左栏和右栏的主体化的区块,Drupal执行以下代码:

$sidebar_left = theme('blocks', 'left');

$sidebar_right = theme('blocks', 'right');

// And any other regions exposed by hook_regions().

 

你可能还记得第8章里面的theme(“block”),它用于调用方法theme_blocks(),下面展示了theme_blocks()做了什么:

function theme_blocks($region) {

$output = '';

if ($list = block_list($region)) {

foreach ($list as $key => $block) {

$output .= theme('block', $block);

}

}

return $output;

}

在前面的代码中,我们为每个给定区域对其区块进行迭代,并为每个区块执行一个主题函数。最后,我们为调用此函数的代码返回该区域内所有主体化的区块。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值