原文链接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的起始和结束符号。
缺少current_posts_contents定义的翻译
这样会导致报错:undefine function current_posts_contents
大家可以直接阅读原文:
https://www.drupal.org/node/1104482