跳转到主要内容
rli 提交于 10 April 2012

原文链接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目录的链接。如果我们是未登录状态或者没有权限访问,我们将无法看到链接。

参考