跳转到主要内容
rli 提交于 14 March 2012

原文链接http://drupal.org/node/1104498

下一步就是把我们之前在自定义方法中获取的信息,转化成区块的内容并显示出来。我们将用到hook_block_view。这个方法将返回两个值。一个是‘subject', 区块的标题。另一个是'content',区块的内容。我们将再次采用switch的结构, 这个结构将为未来可能要添加的区块预留出接口。$delta参数告诉这个方法那一歌区块正在被调用。

访问权限检查

这个是代码的第一部分

<?php function current_posts_block_view($delta = '') { switch($delta){ case 'current_posts': $block['subject'] = t('Current posts'); if(user_access('access content')){ //Retrieve and process data here. } ?>

在把信息显示给用户之前,我们要检查当前的用户是否有权限来查看此信息。在这里,我们执行最基本的权限检查“access content“。 您也可以用drupal所提供的其他的权限检查,或者建立您自己的权限。要查看drupal权限列表,请访问people>list(或者http://example.com/admin/people). 在权限的下拉列表中,您将看到您可以使用的权限的机器名。这个列表将包含您站点的所有权限,包括任何自定义模块的权限。那permission页面的权限名称并不是机器名,所以您不可以把它们用到代码里。

查看可用权限的另一个方法是参看API参考。输入模块名并加上_permission的后缀,比如node_permission。 我们将看到node定义的所有权限。要想知道哪一个权限才是我们需要的没那么容易,比如 access_content是我们在这里要用的,但是它不是block模块所提供的,而是node模块提供的。

在代码中建立链接

这里是下一步的代码

<?php //Use our custom function to retrieve data. $result = current_posts_contents(); //Array to contain items for the block to render. $items = array(); //Iterate over the resultset and format as links. foreach ($result as $node){ $items[] = array( 'data' => l($node->title, 'node/' . $node->nid), ); } ?>

首先,我们在我们自定义的方法中,把内容存储到一个叫作$result的变量中,然后用$item变量来存放要处理的信息。在循环中,我们访问每一个节点,然后根据节点的信息来构建一个链接。

注意,链接是被l()方法所建立的。(小写的L)。第一个参数定义了链接的名字,在这里是节点的名称。第二个参数定义了链接的路径。所有通向节点的路径总会是像"node/#", "#"是节点的ID。l()用这个路径来生成真正的链接。把url转化成相对drupal安装目录的URL

主题化我们的信息

drupal的表示层,也被人们熟知为主题层,是一个可以兼容不同主题的系统。每一个主题都可以控制drupal的外观,并且可以控制CSS文件。drupal主题是一个很大的方面,我们甚至可以用一整本书来讨论它。在这里我们只用到了drupal主题的皮毛。我们将会研究主题是如何分析解读队列的。

这里是 current_posts_block_view 方法的最后一部分。

<?php if (empty($items)) { //No content in the last week. $block['content'] = t('No posts available.'); } else { //Pass data through theme function. $block['content'] = theme('item_list', array( 'items' => $items)); } } } return $block; } ?>

首先,我们要考虑一种可能性,就是我们可能没有任何内容符合要求。我们的区块应该显示是否有上周心法不的内容。

如果$item变量里面有信息,那么我们将用theme()方法。 第一个参数是一个theme钩子。在这个方法中,drupal提供了很多不同theme钩子供我们使用。请参看默认theme钩子列表。我们在这里选择了把信息输出成一个无序的列表,那么我们用到了theme_item_list钩子。第二个参数包含了我们要输出的内容。

您在这里也许有些糊涂了。为什么drupal会明白theme_item_list呢?我们不是在使用theme()么?其实在这里theme()在寻找一个钩子,类似于theme_hookname的格式。如果直接使用这个格式的钩子,那么hookname就充当了theme()的第一个参数。在这里我们用的是_item_list。它定义了我们要输出的默认的格式。

全部的代码

<?php /** * Implements hook_block_view(). * * Prepares the contents of the block. */ function current_posts_block_view($delta = '') { switch($delta){ case 'current_posts': $block['subject'] = t('Current posts'); if(user_access('access content')){ //Use our custom function to retrieve data. $result = current_posts_contents(); //Array to contain items for the block to render. $items = array(); //Iterate over the resultset and format as links. foreach ($result as $node){ $items[] = array( 'data' => l($node->title, 'node/' . $node->nid), ); } if (empty($items)) { //No content in the last week. $block['content'] = t('No posts available.'); } else { //Pass data through theme function. $block['content'] = theme('item_list', array( 'items' => $items)); } } } return $block; } ?>

请记住在添加这个代码到我们的模块文件中时,不要添加php的起始和结束符号。

参考