原文地址: http://drupal.org/node/1104482
下一步我们将建立一个自定义方法来获取最近在站点发布的内容。当一个节点被建立时,drupal把它的建立时间存储到数据库中。我们将用这个数据库字段来查询我们所需的信息。我们本可以把这段代码放到我们下一章要讲的钩子中去,但是把这段代码单独放到一个方法里能够是我们的代码更加清晰明了,便于阅读和管理。
我们将称这个方法为current_posts_contents。我们继续遵循将模块短名作为方法名的前缀的规则,跟着我们放一个非drupal钩子名的词在模块短名后面。这个方法起始于如何获得当前时间。下面是代码的第一部分:
<?php
/**
* Custom content function.
*
* Set beginning and end dates, retrieve posts from database
* saved in that time period.
*
* @return
* A result set of the targeted posts.
*/
function current_posts_contents(){
//Get today's date.
$today = getdate();
//Calculate the date a week ago.
$start_time = mktime(0, 0, 0,$today['mon'],($today['mday'] - 7), $today['year']);
//Get all posts from one week ago to the present.
$end_time = time();
?>
这段代码用来获得当前时间参数(自从新纪元以来到现在的秒数,请参考mktime来了解这里面的含义和格式),然后我们便可以计算出一周前午夜的时间参数。 这段代码是PHP语言编写的,您可以访问php.net来获得更多信息。
下一步我们将用drupal的数据库API来获取我们的节点列表。这是我们自定义方法的第二部分。
<?php
//Use Database API to retrieve current posts.
$query = db_select('node', 'n')
->fields('n', array('nid', 'title', 'created'))
->condition('status', 1) //Published.
->condition('created', array($start_time, $end_time), 'BETWEEN')
->orderBy('created', 'DESC') //Most recent first.
->execute();
return $query;
}
?>
drupal有自带的非常健全的数据库语言构造器,它运用了特有的面向对象API。我们要注意INSERT,UPDATE,DELETE语句将使用以上的格式来构造。drupal将把这个对象转换为相应数据库语言。对于SELECT语句,虽然我们并不是必须要使用以上格式,但是使用以上格式会加深我们对drupal数据库构语句造器的理解。我们在drupal中间到很多类似的结构.
- 我们用db_select命令来构造一个SQL语句,我们将需要把数据库表名和它的简写作为参数传给这个命令。
- 这里的field命令用来告诉SQL我们要从那个表(第一个参数)查询那些字段信息(第二个参数中的队列)。
- condition命令需要三个参数。第一个参数是要查询的字段。第二个参数数我们要查询的值。第三个参数是比较的条件。如果第三个参数是空,那drupal将使用默认条件--等于“=”。
- order命令将根据传进去第一个参数将查询结果排序,第二个参数决定是升序还是降序。
- execute命令用来编译和执行我们所构造的SQL语句,并返回结果(一个对象)。
以下是最终的代码:
<?php
/**
* Custom content function.
*
* Set beginning and end dates, retrieve posts from database
* saved in that time period.
*
* @return
* A result set of the targeted posts.
*/
function current_posts_contents(){
//Get today's date.
$today = getdate();
//Calculate the date a week ago.
$start_time = mktime(0, 0, 0,$today['mon'],($today['mday'] - 7), $today['year']);
//Get all posts from one week ago to the present.
$end_time = time();
//Use Database API to retrieve current posts.
$query = db_select('node', 'n')
->fields('n', array('nid', 'title', 'created'))
->condition('status', 1) //Published.
->condition('created', array($start_time, $end_time), 'BETWEEN')
->orderBy('created', 'DESC') //Most recent first.
->execute();
return $query;
}
?>
请记住在我们的代码中不要包含"?>"