让我们开始我们的例子。我们将实现hook_search()中的name和search操作。
注意 为了使下面的例子能够工作,我们需要启用路径模块,并将一些路径分配给节点(这样就有东西用来搜索了)。在测试这些例子以前,我们还需要重新构建搜索索引数据。导航到“管理➤站点配置➤搜索设置”,点击“重建站点索引”按钮,接着导航到 “管理➤报告➤状态报告”,手动运行cron 。当cron运行时,搜索模块就会执行索引。
在sites/all/modules/custom下面创建一个名为pathfinder的新文件夹,在新目录中创建列表 12-1 和 12-2所示的文件。
列表 12-1. pathfinder.info
; $Id$
name = Pathfinder
description = Gives administrators the ability to search URL aliases.
package = Pro Drupal Development
core = 6.x
列表 12-2. pathfinder.module
<?php
// $Id$
/**
* @file
* Search interface for URL aliases.
*/
在你的文本编辑器中,不要关闭pathfinder.module;我们将继续使用它。接下来要实现的函数是hook_search($op, $keys)。这个钩子基于操作($op)参数的不同而返回不同的信息。
/**
* Implementation of hook_search().
*/
function pathfinder_search($op = 'search', $keys = null) {
switch ($op) {
case 'name':
if (user_access('administer url aliases')) {
return t('URL aliases');
}
break;
case 'search':
if (user_access('administer url aliases')) {
$found = array();
// Replace wildcards with MySQL/PostgreSQL wildcards.
$keys = preg_replace('!\*+!', '%', $keys);
$sql = "SELECT * FROM {url_alias} WHERE LOWER(dst) LIKE LOWER('%%%s%%')";
$result = pager_query($sql, 50, 0, NULL, $keys);
while ($path = db_fetch_object($result)) {
$found[] = array('title' => $path->dst,
'link' => url("admin/build/path/edit/$path->pid"));
}
return $found;
}
}
}
当搜索API调用hook_search('name')时,它将寻找显示在通用搜索页面的菜单标签的名字(参看图12-3)。在这里,我们返回的是“URL 别名”。通过返回菜单标签的名字,搜索API将为菜单标签的链接创建一个新的搜索表单。
图 12-3.通过从hook_search()中返回菜单标签的名字,这样就可以访问搜索表单了
hook_search('search')是hook_search()中的核心部分。当提交搜索表单时,将调这一操作,它的任务是收集并返回搜索结果。在前面的代码中,我们使用表单中提交的搜索词语对url_alias表进行查询。接着,我们将查询的结果收集到一个数组中并将其返回。返回的结果由搜索模块负责格式化并显示给用户,如图12-4所示。
图 12-4.搜索结果由搜索模块负责格式化。
让我们关注一下搜索结果页面。如果默认的搜索结果页面不能满足你的期望,那么你可以对默认视图进行覆写。在我们这里,我们不想把它只显示为一列匹配的别名,我们想为搜索结果使用一个可排序的表格,其中对于每个匹配的别名都为其添加了一个单独的“编辑”链接。通过对hook_search('search')的返回值进行一些调整,并实现hook_search_page(),从而完成这一工作。
/**
* Implementation of hook_search().
*/
function pathfinder_search($op = 'search', $keys = null) {
switch ($op) {
case 'name':
if (user_access('administer url aliases')) {
return t('URL aliases');
}
break;
case 'search':
if (user_access('administer url aliases')) {
$header = array(
array('data' => t('Alias'), 'field' => 'dst'),
t('Operations'),
);
// Return to this page after an 'edit' operation.
$destination = drupal_get_destination();
// Replace wildcards with MySQL/PostgreSQL wildcards.
$keys = preg_replace('!\*+!', '%', $keys);
$sql = "SELECT * FROM {url_alias} WHERE LOWER(dst) LIKE LOWER('%%%s%%')" .tablesort_sql($header);
$result = pager_query($sql, 50, 0, NULL, $keys);
while ($path = db_fetch_object($result)) {
$rows[] = array(
l($path->dst, $path->dst),
l(t('edit'), "admin/build/path/edit/$path->pid",
array('query' => $destination))
);
}
if (!$rows) {
$rows[] = array(array('data' => t('No URL aliases found.'),
'colspan' => '2'));
}
return $rows;
}
}
}
/**
* Implementation of hook_search_page().
*/
function pathfinder_search_page($rows) {
$header = array(
array('data' => t('Alias'), 'field' => 'dst'), ('Operations'));
$output = theme('table', $header, $rows);
$output .= theme('pager', NULL, 50, 0);
return $output;
}
在前面的代码中,我们使用drupal_get_destination()来取回我们当前所在的页面位置,如果我们点击“编辑”链接,来编辑一个URL别名,在提交编辑表单以后,我们将自动返回到这一搜索结果页面。由于目的地的路径信息将作为编辑链接的一部分,传递给了编辑表单,所以编辑表单知道将返回到哪个页面。你将在URL中看到一个名为destination的附加参数,它包含的就是表单后所要返回的URL。
为了对结果表格进行排序,我们将tablesort_sql()函数追加到了搜索查询字符串上,从而确保在查询语句后面追加正确的SQL ORDER BY语句。最后,pathfinder_search_page()是hook_search_page()的一个实现,它允许我们控制搜索结果页面的输出。图12-5显示了最终的搜索结果页面。
图 12-5.搜索结果页面现在将结果呈现为了一个可排序的表格
老葛的Drupal培训班 Think in Drupal
cron下就可以了
运行cron下就可以了
来自 http://www.thinkindrupal.com/node/1616