options['get_per_page']) && ((int) $_GET['per_page']) > 0) { // Remember and later restore the true setting value so we don't // accidentally permanently save the altered one. $page->options['original_per_page'] = $page->options['per_page']; $page->options['per_page'] = (int) $_GET['per_page']; } if (!isset($page->options['result_page_search_form']) || $page->options['result_page_search_form']) { $ret['form'] = drupal_get_form('search_api_page_search_form', $page, $keys); } if ($keys) { try { $results = search_api_page_search_execute($page, $keys); } catch (SearchApiException $e) { $ret['message'] = t('An error occurred while executing the search. Please try again or contact the site administrator if the problem persists.'); watchdog('search_api_page', 'An error occurred while executing a search: !msg.', array('!msg' => $e->getMessage()), WATCHDOG_ERROR, l(t('search page'), $_GET['q'])); } // If spellcheck results are returned then add them to the render array. if (isset($results['search_api_spellcheck'])) { $ret['search_api_spellcheck']['#theme'] = 'search_api_spellcheck'; $ret['search_api_spellcheck']['#spellcheck'] = $results['search_api_spellcheck']; // Let the theme function know where the key is stored by passing its arg // number. We can work this out from the number of args in the page path. $ret['search_api_spellcheck']['#options'] = array( 'arg' => array(count(arg(NULL, $page->path))), ); } $ret['results']['#theme'] = 'search_api_page_results'; $ret['results']['#index'] = search_api_index_load($page->index_id); $ret['results']['#results'] = $results; $ret['results']['#view_mode'] = isset($page->options['view_mode']) ? $page->options['view_mode'] : 'search_api_page_result'; $ret['results']['#keys'] = $keys; if ($results['result count'] > $page->options['per_page']) { pager_default_initialize($results['result count'], $page->options['per_page']); $ret['pager']['#theme'] = 'pager'; $ret['pager']['#quantity'] = 9; } if (!empty($results['ignored'])) { drupal_set_message(t('The following search keys are too short or too common and were therefore ignored: "@list".', array('@list' => implode(t('", "'), $results['ignored']))), 'warning'); } if (!empty($results['warnings'])) { foreach ($results['warnings'] as $warning) { drupal_set_message(check_plain($warning), 'warning'); } } } if (isset($page->options['original_per_page'])) { $page->options['per_page'] = $page->options['original_per_page']; unset($page->options['original_per_page']); } return $ret; } /** * Executes a search. * * @param Entity $page * The page for which a search should be executed. * @param $keys * The keywords to search for. * * @return array * The search results as returned by SearchApiQueryInterface::execute(). */ function search_api_page_search_execute(Entity $page, $keys) { $limit = $page->options['per_page']; $offset = pager_find_page() * $limit; $options = array( 'search id' => 'search_api_page:' . $page->path, 'parse mode' => $page->options['mode'], ); if (!empty($page->options['search_api_spellcheck'])) { $options['search_api_spellcheck'] = TRUE; } $query = search_api_query($page->index_id, $options) ->keys($keys) ->range($offset, $limit); if (!empty($page->options['fields'])) { $query->fields($page->options['fields']); } return $query->execute(); } /** * Function for preprocessing the variables for the search_api_page_results * theme. * * @param array $variables * An associative array containing: * - index: The index this search was executed on. * - results: An array of search results, as returned by * SearchApiQueryInterface::execute(). * - keys: The keywords of the executed search. */ function template_preprocess_search_api_page_results(array &$variables) { if (!empty($variables['results']['results'])) { $variables['items'] = $variables['index']->loadItems(array_keys($variables['results']['results'])); } } /** * Theme function for displaying search results. * * @param array $variables * An associative array containing: * - index: The index this search was executed on. * - results: An array of search results, as returned by * SearchApiQueryInterface::execute(). * - items: The loaded items for all results, in an array keyed by ID. * - view_mode: The view mode to use for displaying the individual results, * or the special mode "search_api_page_result" to use the theme function * of the same name. * - keys: The keywords of the executed search. */ function theme_search_api_page_results(array $variables) { drupal_add_css(drupal_get_path('module', 'search_api_page') . '/search_api_page.css'); $index = $variables['index']; $results = $variables['results']; $items = $variables['items']; $keys = $variables['keys']; $output = '
' . format_plural($results['result count'], 'The search found 1 result in @sec seconds.', 'The search found @count results in @sec seconds.', array('@sec' => round($results['performance']['complete'], 3))) . '
'; if (!$results['result count']) { $output .= "\n