原文链接http://drupal.org/node/1118218
现在我们将要编写一个页面方法,来把页面内容返回到我们之前建立的current_posts_menu()钩子中去。下面是代码的第一部分:
<?php
/**
* Custom page callback function, declared in current_posts_menu().
*/
function _current_posts_page() {
$result = current_posts_contents('page');
//Array to contain items for the page 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),
);
}
?>
是不是看上去跟之前所编写的代码很相似?我们调用之前建立的方法来读取数据库信息,传入参数'page‘, 这样程序就会返回所有的信息。然后我们就可以遍历返回的信息,为美一个节点生成链接。
解析队列
下面我们将进入drupal的主题系统来把我们的队列内容输出成特定的格式。drupal7总是把页面的内容储存在队列里,然后主题系统将才把内容打印输出。这样我们就尽可能长时间的可以把内容当作数据来处理,而不是HTML代码。请参看更完整的解释 Render Arrays in Drupal 7下面的代码包含了我们第一个可解析的队列:
<?php
if (empty($items)) { //No content in the last week.
$page_array['current_posts_arguments'] = array(
//Title serves as page subtitle
'#title' => t('All posts from the last week'),
'#markup' => t('No posts available.'),
);
return $page_array;
}
?>
这段代码跟current_posts_block_view()方法(当没有信息显示时)的显示效果一样。我们建立一个队列变量$page_array。变量名只要不合其他变量方法名冲突,是无关紧要的。为了编码的一致性,我们沿用模块名为变量名的前缀。
子队列严格的遵循可解析队列的格式。元素名前缀为"#",应用解析队列API中的元素。#title元素定义了这个队列包含的内容的标题。页面的标题是由curent_posts_menu()定义的,所以这里定义的是子标题。#markup是最简单的元素,在这里提供一个您要显示的string。您也可以用HTML代码。只要用t()方法来翻译他们即可。
您可能发现这个方法看上去与我们之前建立的设置表格的方法相似。他们都用‘#’来当作元素的前缀。form API总是用render API的元素,但是我们之前没有很好的把这一部分写到文档里。现在在drupal7,我们能够从form API索引找到所有form API所用到的元素。
主题钩子的建议
下面是代码的最后一部分:
<?php
else {
$page_array['current_posts_arguments'] = array(
'#title' => t('All posts from the last week'),
'#items' => $items,
//Theme hook with suggestion.
'#theme' => 'item_list__current_posts',
);
return $page_array;
}
}
?>
我们又用到了#title元素。跟着的两行我们调用theme_item_list()来解析队列。在current_posts_block_view()方法中,我们用到了下面的代码:theme('item_list', array('items' => $items));,它们的功能是一样的。$items变量包含了一个链接的队列,被付给了#items元素,#theme元素定义了我们将用drupal默认的item lists作为主题输出格式。
在这里我们注意到一个细节。我们在主题钩子调用是用了两个下划线加模块名。这样是为了给其他主题编写者更大的自由。如果我们在这里只用默认的主题钩子,其他主题编写者做的任何改动将被应用于这个钩子,不只是我们的列表。在这里,主题将只修改我们的本模块的输出格式。
两个下划线是drupal认识的格式,它表示这是一个建议的主题钩子。如果您需要,您可以编写任意的有双下划线的建议。drupal将优先查找建议的主题钩子,然后才是默认的钩子。本模块并不使用建议的主题钩子,但是这是可以被加入的。
检查
是时候检查我们的模块了。 激活我们的模块并点击Navigation目录的链接。如果我们是未登录状态或者没有权限访问,我们将无法看到链接。