diff --git a/apachesolr_multisitesearch.admin.inc b/apachesolr_multisitesearch.admin.inc index ce130fc..e663de5 100644 --- a/apachesolr_multisitesearch.admin.inc +++ b/apachesolr_multisitesearch.admin.inc @@ -7,7 +7,7 @@ function apachesolr_multisitesearch_metadata() { $document = new ApacheSolrDocument(); - $document->id = apachesolr_document_id(0, 'multisite_metadata'); + $document->id = apachesolr_document_id(1, 'multisite_metadata'); $document->site = url(NULL, array('absolute' => TRUE)); $document->hash = apachesolr_site_hash(); $document->entity_id = 1; diff --git a/apachesolr_multisitesearch.info b/apachesolr_multisitesearch.info index ab9632e..a7c38cf 100644 --- a/apachesolr_multisitesearch.info +++ b/apachesolr_multisitesearch.info @@ -2,5 +2,5 @@ name = Apache Solr Multisite Search description = Search across multiple sites with Solr dependencies[] = apachesolr dependencies[] = apachesolr_search -package = Apache Solr +package = Search Toolkit core = "7.x" \ No newline at end of file diff --git a/apachesolr_multisitesearch.module b/apachesolr_multisitesearch.module index 3b5129b..d1204cc 100644 --- a/apachesolr_multisitesearch.module +++ b/apachesolr_multisitesearch.module @@ -10,8 +10,8 @@ */ function apachesolr_multisitesearch_menu() { $items = array(); - $items['admin/config/search/apachesolr/multisite-filters'] = array( - 'title' => 'Multisite settings', + $items['admin/config/search/apachesolr/multisite-index'] = array( + 'title' => 'Multisite index', 'page callback' => 'drupal_get_form', 'page arguments' => array('apachesolr_multisitesearch_settings'), 'weight' => -8, @@ -23,124 +23,15 @@ function apachesolr_multisitesearch_menu() { } /** - * Implementation of hook_search_info(). - */ -function apachesolr_multisitesearch_search_info() { - return array( - 'title' => 'Multisite', - 'path' => 'multisite', - 'conditions_callback' => 'apachesolr_search_conditions', - ); -} - -/** - * Implements hook_search_execute(). - */ -function apachesolr_multisitesearch_search_execute($keys = NULL, $conditions = NULL) { - $filters = isset($conditions['fq']) ? $conditions['fq'] : array(); - $solrsort = isset($_GET['solrsort']) ? $_GET['solrsort'] : ''; - $empty_search_behavior = isset($conditions['apachesolr_search_browse']) ? $conditions['apachesolr_search_browse'] : ''; - unset($conditions['apachesolr_search_browse']); - try { - if (!$keys && !$conditions && ($empty_search_behavior == 'browse' || $empty_search_behavior == 'blocks')) { - // Pass empty search behavior as string on to apachesolr_search_search_page() - apachesolr_search_run_empty('apachesolr', 'search/' . arg(1)); - $results['apachesolr_search_browse'] = $empty_search_behavior; - if ($empty_search_behavior == 'browse') { - // Hide sidebar blocks for content-area browsing instead. - apachesolr_suppress_blocks(TRUE); - } - } - else { - $results = apachesolr_multisitesearch_run('apachesolr', array('q' => $keys, 'fq' => $filters), $solrsort, 'search/' . arg(1), pager_find_page()); - } - return $results; - } - catch (Exception $e) { - watchdog('Apache Solr', nl2br(check_plain($e->getMessage())), NULL, WATCHDOG_ERROR); - apachesolr_failure(t('Solr search'), $keys); - } -} - -/** - * Execute a search results based on keyword, filter, and sort strings. - * - * @param $name - * @param $params - * Array - 'q' is the keywords to search. - * @param $solrsort - * @param $base_path - * For constructing filter and sort links. Leave empty unless the links need to point somewhere - * other than the base path of the current request. - * @param integer $page - * For pagination. - * @param $caller - * - * @return stdClass $response - * - * @throws Exception - */ -function apachesolr_multisitesearch_run($name, array $params = array(), $solrsort = '', $base_path = '', $page = 0, $solr = NULL) { - // This is the object that knows about the query coming from the user. - $query = apachesolr_drupal_query($name, $params, $solrsort, $base_path, $solr); - $query->multisite = TRUE; - apachesolr_multisitesearch_basic_params($query); - apachesolr_search_add_boost_params($query); - if ($query->getParam('q')) { - apachesolr_search_highlighting_params($query); - if (!$query->getParam('hl.fl')) { - $qf = array(); - foreach ($query->getParam('qf') as $field) { - // Truncate off any boost so we get the simple field name. - $parts = explode('^', $field, 2); - $qf[$parts[0]] = TRUE; - } - foreach (array('content', 'ts_comments') as $field) { - if (isset($qf[$field])) { - $query->addParam('hl.fl', $field); - } - } - } - apachesolr_search_add_spellcheck_params($query); - } - else { - // No highlighting, use the teaser as a snippet. - $query->addParam('fl', 'teaser'); - } - list($final_query, $response) = apachesolr_do_query($query, $page); - apachesolr_has_searched(TRUE); - return apachesolr_multisitesearch_process_response($response, $final_query); -} - -/** - * Implements hook_search_page(). - */ -function apachesolr_multisitesearch_search_page($results) { - if (!empty($results['apachesolr_search_browse'])) { - // Show facet browsing blocks. - $output = apachesolr_search_page_browse($results['apachesolr_search_browse']); - } - elseif ($results) { - $output = array( - '#theme' => 'search_results', - '#results' => $results, - '#module' => 'apachesolr_search', - ); - } - else { - // No suggestions found, give the user some custom help text. - $output = isset($output) ? $output : array('#markup' => theme('apachesolr_search_noresults')); - } - return $output; -} - -/** * Implements hook_apachesolr_process_results(). */ -function apachesolr_multisitesearch_apachesolr_process_results(&$results, $namespace = FALSE) { - if ($namespace == 'apachesolr_multisitesearch') { +function apachesolr_multisitesearch_apachesolr_process_results(&$results, $query) { + $env_id = $query->solr('getId'); + if (apachesolr_environment_variable_get($env_id, 'multisitesearch')) { foreach ($results as $key => $result) { $results[$key]['extra']['hash'] = theme('apachesolr_multisitesearch_breadcrumb_hash', array('hash' => $result['fields']['hash'])); + // Use an absolute URL. + $results[$key]['link'] = url($result['fields']['url'], array('absolute' => TRUE)); } } } @@ -175,112 +66,13 @@ function apachesolr_multisitesearch_refresh_metadata() { * Implements hook_apachesolr_query_alter(). */ function apachesolr_multisitesearch_apachesolr_query_alter(DrupalSolrQueryInterface $query) { - if (empty($query->multisite)) { + $env_id = $query->solr('getId'); + $multisite = apachesolr_environment_variable_get($env_id, 'multisitesearch'); + if (empty($multisite)) { // Limit single site searchs via the site hash. - // @TODO: This is currently stopping apachesolr_autocomplete from working correctly - // $query->addFilter('hash', apachesolr_site_hash()); - } -} - -function apachesolr_multisitesearch_basic_params(DrupalSolrQueryInterface $query = NULL) { - $params = array( - 'fl' => array('id', 'entity_id', 'entity_type', 'bundle', 'bundle_name', 'label', 'is_comment_count', 'ds_created', 'ds_changed', 'score', 'path', 'url', 'is_uid', 'tos_name', 'site', 'hash'), - 'rows' => variable_get('apachesolr_rows', 10), - ); - if ($query) { - $query->addParams($params); - } - return $params; -} - -function apachesolr_multisitesearch_process_response($response, DrupalSolrQueryInterface $query) { - $results = array(); - // We default to getting snippets from the body content and comments. - $hl_fl = $query->getParam('hl.fl'); - if (!$hl_fl) { - $hl_fl = array('content', 'ts_comments'); - } - $total = $response->response->numFound; - pager_default_initialize($total, $query->getParam('rows')); - if ($total > 0) { - foreach ($response->response->docs as $doc) { - $extra = array(); - - // Start with an empty snippets array. - $snippets = array(); - - // Find the nicest available snippet. - foreach ($hl_fl as $hl_param) { - if (isset($response->highlighting->{$doc->id}->$hl_param)) { - // Merge arrays preserving keys. - foreach ($response->highlighting->{$doc->id}->$hl_param as $values) { - $snippets[$hl_param] = $values; - } - } - } - // If there's no snippet at this point, add the teaser. - if (!$snippets) { - if (isset($doc->teaser)) { - $snippets[] = truncate_utf8($doc->teaser, 256, TRUE); - } - } - $hook = 'apachesolr_search_snippets__' . $doc->entity_type; - if (!empty($doc->bundle)) { - $hook .= '__' . $doc->bundle; - } - $snippet = theme($hook, array('doc' => $doc, 'snippets' => $snippets)); - - if (!isset($doc->content)) { - $doc->content = $snippet; - } - // Normalize common dates so that we can use Drupal's normal date and - // time handling. - if (isset($doc->ds_created)) { - $doc->created = strtotime($doc->ds_created); - } - if (isset($doc->ds_changed)) { - $doc->changed = strtotime($doc->ds_changed); - } - if (isset($doc->tos_name)) { - $doc->name = $doc->tos_name; - } - $extra = array(); - // Allow modules to alter each document and its extra information. - drupal_alter('apachesolr_search_result', $doc, $extra); - $fields = (array) $doc; - $result = array( - // link is a required field, so handle it centrally. - 'link' => url($doc->url, array('absolute' => TRUE)), - // template_preprocess_search_result() runs check_plain() on the title - // again. Decode to correct the display. - 'title' => htmlspecialchars_decode($doc->label, ENT_QUOTES), - // These values are not required by the search module but are provided - // to give entity callbacks and themers more flexibility. - 'score' => $doc->score, - 'snippets' => $snippets, - 'snippet' => $snippet, - 'fields' => $fields, - 'entity_type' => $doc->entity_type, - 'user' => theme('apachesolr_multisitesearch_username', array('doc' => $doc)), - ); - if (isset($doc->bundle) && !empty($doc->bundle)) { - $result['bundle'] = $doc->bundle; - } - // Call entity-type-specific callbacks for extra handling. - $function = apachesolr_entity_get_callback($doc->entity_type, 'result callback'); - if (is_callable($function)) { - $function($doc, $result, $extra); - } - $result['extra'] = $extra; - $results[] = $result; - } - // Hook to allow modifications of the retrieved results - foreach (module_implements('apachesolr_process_results') as $module) { - $function = $module . '_apachesolr_process_results'; - $function($results, 'apachesolr_multisitesearch'); - } + $query->addFilter('hash', apachesolr_site_hash()); + //'url', 'is_uid', 'tos_name', 'site', 'hash' } - return $results; } /** @@ -350,70 +142,9 @@ function apachesolr_multisitesearch_apachesolr_delete_index_alter(&$query) { } /** - * Implements hook_form_[form_id]_alter(). - * - * This adds spelling suggestions, retain filters to the search form. - */ -function apachesolr_multisitesearch_form_search_form_alter(&$form, $form_state) { - if ($form['module']['#value'] == 'apachesolr_multisitesearch') { - $form['#submit'][] = 'apachesolr_search_form_search_submit'; - // No other modification make sense unless a query is active. - // Note - this means that the query must always be run before - // calling drupal_get_form('search_form'). - $apachesolr_has_searched = apachesolr_has_searched(); - - $searcher = NULL; - $fq = NULL; - if ($apachesolr_has_searched) { - $query = apachesolr_current_query(); - $searcher = $query->getSearcher(); - // We use the presence of filter query params as a flag for the retain filters checkbox. - $fq = $query->getParam('fq'); - } - - $form['basic']['apachesolr_search']['#tree'] = TRUE; - $form['basic']['apachesolr_search']['get'] = array( - '#type' => 'hidden', - '#default_value' => json_encode(array_diff_key($_GET, array('q' => 1, 'page' => 1, 'solrsort' => 1, 'retain-filters' => 1))), - ); - - if ($fq || isset($form_state['input']['apachesolr_search']['retain-filters'])) { - $form['basic']['apachesolr_search']['retain-filters'] = array( - '#type' => 'checkbox', - '#title' => t('Retain current filters'), - '#default_value' => (int) isset($_GET['retain-filters']), - ); - } - - if (variable_get('apachesolr_search_spellcheck', TRUE) && $apachesolr_has_searched && ($response = apachesolr_static_response_cache($searcher))) { - // Get spellchecker suggestions into an array. - if (isset($response->spellcheck->suggestions) && $response->spellcheck->suggestions) { - $suggestions = get_object_vars($response->spellcheck->suggestions); - if ($suggestions) { - // Get the original query and replace words. - - foreach ($suggestions as $word => $value) { - $replacements[$word] = $value->suggestion[0]; - } - $new_keywords = strtr($query->getParam('q'), $replacements); - - // Show only if suggestion is different than current query. - if ($query->getParam('q') != $new_keywords) { - $form['apachesolr_search']['suggestion'] = array( - '#theme' => 'apachesolr_search_suggestions', - '#links' => array(l($new_keywords, $query->getPath($new_keywords))), - ); - } - } - } - } - } -} - -/** * Implements hook_facetapi_facet_info(). */ -function apachesolr_multisitesearch_facetapi_facet_info($searcher_info) { +function apachesolr_multisitesearch_facet_info($searcher_info) { $facets = array(); $facets['hash'] = array( 'label' => t('Site'),