'admin/settings/activesearch',
'title' => t('Active search'),
'description' => t('Configuration for active searching'),
'callback' => 'drupal_get_form',
'callback arguments' => array('activesearch_admin_settings')
);
}
elseif (user_access('search via ajax') && activesearch_supported_browser()) {
if (arg(0) == 'search' && arg(1) == 'node' && arg(2)) {
$q = $_GET;
$querystring = array();
unset($q['q']);
foreach ($q as $key => $value) {
if ($key != 'q') {
$querystring[] = $key .'='. $value;
}
}
drupal_goto('search/node', !empty($querystring) ? implode('&', $querystring) : NULL, 'keys='. arg(2));
}
activesearch_load();
}
return $items;
}
/**
* Implementation of hook_perm().
*/
function activesearch_perm() {
return array('search via ajax');
}
/**
* Implementation of hook_form_alter().
*/
function activesearch_form_alter($form_id, &$form) {
if (activesearch_supported_browser()) {
if (isset($_POST['activesearch']) && in_array($form_id, array('search_form', 'search_theme_form', 'search_block_form'))) {
$form['#submit']['activesearch_submit'] = array();
$form['#validate']['activesearch_validate'] = array();
}
if ($form_id == 'search_form') {
$form['#suffix'] .= '
';
$form['page'] = array(
'#type' => 'hidden',
'#value' => '',
);
}
}
}
function activesearch_admin_settings() {
$form = array();
$form['activesearch_tabs_mode'] = array(
'#type' => 'radios',
'#title' => t('Tabs'),
'#default_value' => variable_get('activesearch_tabs_mode', 'node'),
'#options' => array(0 => t('none'), 'term' => t('categories'), 'node' => t('content types')),
'#description' => t('Select the types of tabs you would like for displaying search results.'),
);
$form['activesearch_nodes'] = array(
'#type' => 'checkboxes',
'#title' => t('Content types'),
'#default_value' => variable_get('activesearch_nodes', array()),
'#options' => node_get_types('names'),
'#description' => t('If you wish to present ajax search results by content type, select the content types to use here.'),
);
$form = system_settings_form($form);
return $form;
}
function activesearch_validate($form_id, $form_values, $form) {
form_set_value(array('#parents' => array('page')), isset($_POST['page']) ? $_POST['page'] : '');
}
function activesearch_submit($form_id, $form_values) {
$type = $form_values['module'] ? $form_values['module'] : 'node';
if (in_array($form_id, array('search_theme_form', 'search_block_form'))) {
$keys = $form_values[$form_id .'_keys'];
// We can't return a string that includes the keys. Instead
// we set the destination directly.
$_REQUEST['destination'] = 'search/'. $type .'#keys='. $keys;
return;
}
$keys = $form_values['processed_keys'];
$_GET['q'] = 'search/'. $type .'/'. $keys;
$_GET['page'] = $form_values['page'];
print drupal_to_js(array('status' => TRUE, 'data' => array('keys' => $keys, 'results' => activesearch_results($keys, $type))));
exit();
}
function activesearch_results($keys, $type, $create = TRUE) {
// We need to call search_data even if we're overriding the results
// in order to seed the results temporary table.
$results = $create ? search_data($keys, $type) : array();
if (($results || !$create) && $type == 'node') {
switch (variable_get('activesearch_tabs_mode', 'node')) {
case 'node':
// If user has entered type information, use it.
if ($node_types = search_query_extract($keys, 'type')) {
$node_types = explode(',', $node_types);
}
// Otherwise look for registered types.
else {
$node_types = array_filter(variable_get('activesearch_nodes', array()));
unset($node_types[0]);
}
// If neither, use the types of the found items.
if (!count($node_types)) {
$result = db_query_range("SELECT DISTINCT(n.type) FROM temp_search_results r INNER JOIN {node} n ON r.sid = n.nid", 0, 10);
while ($row = db_fetch_array($result)) {
$node_types[] = $row['type'];
}
}
if (count($node_types)) {
return theme('activesearch_results', 'node', $keys, $node_types, $results);
}
break;
case 'term':
// If user has entered type information, use it.
if ($tids = search_query_extract($keys, 'category')) {
$tids = explode(',', $tids);
}
// Otherwise look for registered types.
else {
$tids = array_filter(variable_get('activesearch_activesearch_terms', array()));
unset($tids[0]);
}
// If neither, use the tids of the found items.
if (!count($tids)) {
$result = db_query_range("SELECT DISTINCT(tn.tid) FROM temp_search_results r INNER JOIN {term_node} tn ON r.sid = tn.nid", 0, 10);
while ($row = db_fetch_array($result)) {
$tids[] = $row['tid'];
}
}
if (count($tids)) {
return theme('activesearch_results', 'term', $keys, $tids, $results);
}
break;
}
}
return $results ? $results : (form_get_errors() ? theme('status_messages') : t('No matches found.'));
}
/**
* Load/set the required files and javascript for activesearch.
*/
function activesearch_load() {
drupal_add_js('misc/progress.js');
$path = drupal_get_path('module', 'activesearch');
jstools_add_js($path . '/activesearch.js');
drupal_add_js(drupal_get_path('module', 'jstools') . '/jquery.history_remote.pack.js');
module_invoke('tabs', 'load');
}
function activesearch_results_node($type, $keys) {
// Do actual search query
$result = db_query_range("SELECT * FROM temp_search_results r INNER JOIN {node} n ON r.sid = n.nid WHERE n.type = '%s'", $type, 0, 10);
return activesearch_results_items($result, $keys);
}
function activesearch_results_term($tid, $keys) {
// Do actual search query
$result = db_query_range("SELECT * FROM temp_search_results r INNER JOIN {node} n ON r.sid = n.nid INNER JOIN {term_node} tn ON tn.nid = n.nid WHERE tn.tid = %d", $tid, 0, 10);
return activesearch_results_items($result, $keys);
}
function activesearch_results_items($result, $keys) {
$find = array();
while ($item = db_fetch_object($result)) {
$find[] = $item;
}
// Load results
$results = array();
// From node_search().
foreach ($find as $item) {
// Build the node body.
$node = node_load($item->sid);
$node = node_build_content($node, FALSE, FALSE);
$node->body = drupal_render($node->content);
// Fetch comments for snippet
$node->body .= module_invoke('comment', 'nodeapi', $node, 'update index');
// Fetch terms for snippet
$node->body .= module_invoke('taxonomy', 'nodeapi', $node, 'update index');
$extra = node_invoke_nodeapi($node, 'search result');
$results[] = array('link' => url('node/'. $item->sid, NULL, NULL, TRUE),
'type' => node_get_types('name', $node),
'title' => $node->title,
'user' => theme('username', $node),
'date' => $node->changed,
'node' => $node,
'extra' => $extra,
'snippet' => search_excerpt($keys, $node->body));
}
foreach ($results as $entry) {
$output .= theme('search_item', $entry, 'node');
}
return $output;
}
function theme_activesearch_results($object_type, $keys, $items, $results) {
$tabs = array();
$tabs['activesearch'] = array(
'#type' => 'tabset',
);
$tabs['activesearch']['all'] = array(
'#type' => 'tabpage',
'#title' => t('All'),
'#content' => $results,
);
switch ($object_type) {
case 'node':
foreach ($items as $node_type) {
if ($result = activesearch_results_node($node_type, $keys)) {
$tabs['activesearch'][$node_type] = array(
'#type' => 'tabpage',
'#title' => node_get_types('name', $node_type) ? node_get_types('name', $node_type) : $node_type,
'#content' => $result,
);
}
}
break;
case 'term':
foreach ($items as $tid) {
if ($result = activesearch_results_term($tid, $keys)) {
$term = taxonomy_get_term($tid);
$tabs['activesearch'][$tid] = array(
'#type' => 'tabpage',
'#title' => $term->name,
'#content' => $result,
);
}
}
break;
}
return tabs_render($tabs);
}
function activesearch_supported_browser() {
return !strstr($_SERVER['HTTP_USER_AGENT'], 'Safari');
}