You are here

使得路径别名能被搜索

 

让我们开始我们的例子。我们将实现hook_search()中的namesearch操作。
 
注意 为了使下面的例子能够工作,我们需要启用路径模块,并将一些路径分配给节点(这样就有东西用来搜索了)。在测试这些例子以前,我们还需要重新构建搜索索引数据。导航到“管理➤站点配置➤搜索设置”,点击“重建站点索引”按钮,接着导航到管理➤报告➤状态报告”,手动运行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

Drupal版本: