首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展Drupal7搜索

扩展Drupal7搜索
EN

Stack Overflow用户
提问于 2011-12-20 20:14:36
回答 1查看 7.9K关注 0票数 4

我想在默认的Drupal7节点搜索中增加一个额外的字段。

我使用以下新字段更改搜索表单:

代码语言:javascript
复制
function mymodule_form_search_form_alter(&$form, &$form_state, $form_id) {
    $form['basic']['site'] = array(
        '#type' => 'select',
        '#options' => array(
            'KEY1' => 'TITLE1',
            'KEY2' => 'TITLE2',
            'KEY3' => 'TITLE3'
        )
    );
}

我有一个名为field_data_field_site.field_site_value的字段,我需要在此搜索中将其用作过滤器。

我曾尝试阅读有关hook_search_*函数的内容,但没有理解其中的意思。

我的问题如下。如何扩展搜索表单?谁有活生生的例子?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-22 00:05:39

下面是我解决这个问题的最好方法。

首先,我需要用我的字段修改Drupal的搜索块和搜索表单,并定义新的提交函数。

代码语言:javascript
复制
/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_search_block_form_alter(&$form, &$form_state, $form_id) {
    $form['#submit'][] = 'search_form_alter_submit';

    $form['site'] = array(
        '#type' => 'select',
        '#options' => _options(),
        '#default_value' => (($_GET['site']) ? $_GET['site'] : '')
    );
}

/**
 * Implements hook_form_FORM_ID_alter().
 */
function mymodule_form_search_form_alter(&$form, &$form_state, $form_id) {
    $form['#submit'][] = 'search_form_alter_submit';

    $form['basic']['site'] = array(
        '#type' => 'select',
        '#options' => _options(),
        '#default_value' => (($_GET['site']) ? $_GET['site'] : '')
    );
}

function _options() {
    return array(
        '' => 'Select site',
        'site-1' => 'Site 1',
        'site-2' => 'Site 2'
    );
}

提交功能将把我们转到默认的search/node页面,但与我们的查询。页面看起来会像search/node/Our-query-string?site=Our-option-selected

代码语言:javascript
复制
function search_form_alter_submit($form, &$form_state) {
    $path = $form_state['redirect'];
    $options = array(
        'query' => array(
            'site' => $form_state['values']['site']
        )
    );
    drupal_goto($path, $options);
}

下一步是使用hook_search_info (别忘了在admin/config/search/settings页面上打开它并设置为默认值)。

代码语言:javascript
复制
/**
 * Implements hook_search_info().
 */
function mymodule_search_info() {
    return array(
        'title' => 'Content',
        'path' => 'node',
        'conditions_callback' => '_conditions_callback',
    );
}

hook_search_info中定义的条件回调函数。我们需要为我们的搜索提供额外的查询。

代码语言:javascript
复制
function _conditions_callback($keys) {
    $conditions = array();
    if (!empty($_REQUEST['site'])) {
        $conditions['site'] = $_REQUEST['site'];
    }
    return $conditions;
}

最后,hook_search_execute将根据我们的查询过滤我们的内容。我使用了这个钩子中的默认代码,并对其进行了必要的修改。

代码语言:javascript
复制
/**
 * Implements hook_search_execute().
 */
function mymodule_search_execute($keys = NULL, $conditions = NULL) {
    // Build matching conditions
    $query = db_select('search_index', 'i', array('target' => 'slave'))
        ->extend('SearchQuery')
        ->extend('PagerDefault');

    $query->join('node', 'n', 'n.nid = i.sid');

    // Here goes my filter where I joined another table and
    // filter by required field
    $site = (isset($conditions['site'])) ? $conditions['site'] : NULL;
    if ($site) {
        $query->leftJoin('field_data_field_site', 's', 's.entity_id = i.sid');
        $query->condition('s.field_site_value', $site);
    }
    // End of my filter

    $query
        ->condition('n.status', 1)
        ->addTag('node_access')
        ->searchExpression($keys, 'node');

    // Insert special keywords.
    $query->setOption('type', 'n.type');
    $query->setOption('language', 'n.language');
    if ($query->setOption('term', 'ti.tid')) {
        $query->join('taxonomy_index', 'ti', 'n.nid = ti.nid');
    }

    // Only continue if the first pass query matches.
    if (!$query->executeFirstPass()) {
        return array();
    }

    // Add the ranking expressions.
    _node_rankings($query);

    // Load results.
    $find = $query
        ->limit(10)
        ->execute();

    $results = array();
    foreach ($find as $item) {
        // Build the node body.
        $node = node_load($item->sid);
        node_build_content($node, 'search_result');
        $node->body = drupal_render($node->content);

        // Fetch comments for snippet.
        $node->rendered .= ' ' . module_invoke('comment', 'node_update_index', $node);
        // Fetch terms for snippet.
        $node->rendered .= ' ' . module_invoke('taxonomy', 'node_update_index', $node);

        $extra = module_invoke_all('node_search_result', $node);

        $results[] = array(
            'link' => url("node/{$item->sid}", array('absolute' => TRUE)),
            'type' => check_plain(node_type_get_name($node)),
            'title' => $node->title,
            'user' => theme('username', array('account' => $node)),
            'date' => $node->changed,
            'node' => $node,
            'extra' => $extra,
            'score' => $item->calculated_score,
            'snippet' => search_excerpt($keys, $node->body)
        );
    }

    return $results;
}

如果有人能给我一个更好的答案,我会很高兴。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8575289

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档