diff --git a/modules/node.module b/modules/node.module index e81eea65ae7..0199432a5bd 100644 --- a/modules/node.module +++ b/modules/node.module @@ -705,7 +705,7 @@ function node_search($op = 'search', $keys = null) { // Load results $results = array(); foreach ($find as $item) { - $node = node_load($item); + $node = node_load($item->sid); // Get node output (filtered and with module-specific fields). if (node_hook($node, 'view')) { @@ -721,7 +721,7 @@ function node_search($op = 'search', $keys = null) { $node->body .= module_invoke('comment', 'nodeapi', $node, 'update index'); $extra = node_invoke_nodeapi($node, 'search result'); - $results[] = array('link' => url('node/'. $item), + $results[] = array('link' => url('node/'. $item->sid), 'type' => node_get_name($node), 'title' => $node->title, 'user' => theme('username', $node), diff --git a/modules/node/node.module b/modules/node/node.module index e81eea65ae7..0199432a5bd 100644 --- a/modules/node/node.module +++ b/modules/node/node.module @@ -705,7 +705,7 @@ function node_search($op = 'search', $keys = null) { // Load results $results = array(); foreach ($find as $item) { - $node = node_load($item); + $node = node_load($item->sid); // Get node output (filtered and with module-specific fields). if (node_hook($node, 'view')) { @@ -721,7 +721,7 @@ function node_search($op = 'search', $keys = null) { $node->body .= module_invoke('comment', 'nodeapi', $node, 'update index'); $extra = node_invoke_nodeapi($node, 'search result'); - $results[] = array('link' => url('node/'. $item), + $results[] = array('link' => url('node/'. $item->sid), 'type' => node_get_name($node), 'title' => $node->title, 'user' => theme('username', $node), diff --git a/modules/search.module b/modules/search.module index d2c6f5e768b..d7296037377 100644 --- a/modules/search.module +++ b/modules/search.module @@ -821,12 +821,16 @@ function _search_parse_query(&$word, &$scores, $not = false) { * @param $arguments2 * (optional) Extra SQL arguments belonging to the second query parameter. * + * @param $sort_parameters + * (optional) SQL arguments for sorting the final results. + * Default: 'ORDER BY score DESC' + * * @return * An array of SIDs for the search results. * * @ingroup search */ -function do_search($keywords, $type, $join1 = '', $where1 = '1', $arguments1 = array(), $select2 = 'i.relevance AS score', $join2 = '', $arguments2 = array()) { +function do_search($keywords, $type, $join1 = '', $where1 = '1', $arguments1 = array(), $select2 = 'i.relevance AS score', $join2 = '', $arguments2 = array(), $sort_parameters = 'ORDER BY score DESC') { $query = search_parse_query($keywords); if ($query[2] == '') { @@ -852,7 +856,7 @@ function do_search($keywords, $type, $join1 = '', $where1 = '1', $arguments1 = a // Second pass: only keep items that match the complicated keywords conditions (phrase search, negative keywords, ...) $conditions = '('. $query[0] .')'; $arguments = array_merge($arguments2, $query[1]); - $result = db_query_temporary("SELECT i.type, i.sid, $select2 FROM temp_search_sids i INNER JOIN {search_dataset} d ON i.sid = d.sid AND i.type = d.type $join2 WHERE $conditions ORDER BY score DESC", $arguments, 'temp_search_results'); + $result = db_query_temporary("SELECT i.type, i.sid, $select2 FROM temp_search_sids i INNER JOIN {search_dataset} d ON i.sid = d.sid AND i.type = d.type $join2 WHERE $conditions $sort_parameters", $arguments, 'temp_search_results'); if (($count = db_result(db_query('SELECT COUNT(*) FROM temp_search_results'))) == 0) { return array(); } @@ -862,7 +866,7 @@ function do_search($keywords, $type, $join1 = '', $where1 = '1', $arguments1 = a $result = pager_query("SELECT * FROM temp_search_results", 10, 0, $count_query, $arguments); $results = array(); while ($item = db_fetch_object($result)) { - $results[] = $item->sid; + $results[] = $item; } return $results; } @@ -1008,23 +1012,19 @@ function search_form($action = '', $keys = '', $type = null, $prompt = null) { * Perform a standard search on the given keys, and return the formatted results. */ function search_data($keys = NULL, $type = 'node') { - $output = ''; - if (isset($keys)) { if (module_hook($type, 'search')) { $results = module_invoke($type, 'search', 'search', $keys); if (isset($results) && is_array($results) && count($results)) { - $output .= '
'; - foreach ($results as $entry) { - $output .= theme('search_item', $entry, $type); + if (module_hook($type, 'search_page')) { + return module_invoke($type, 'search_page', $results); + } + else { + return theme('search_page', $results, $type); } - $output .= '
'; - $output .= theme('pager', NULL, 15, 0); } } } - - return $output; } /** @@ -1151,10 +1151,8 @@ function _search_excerpt_replace(&$text) { } /** - * Format a single result entry of a search query. - * - * Modules may implement hook_search_item() in order to override this default - * function to display search results. + * Format a single result entry of a search query. This function is normally + * called by theme_search_page() or hook_search_page(). * * @param $item * A single search result as returned by hook_search(). The result should be @@ -1167,26 +1165,46 @@ function _search_excerpt_replace(&$text) { * @ingroup themeable */ function theme_search_item($item, $type) { - if (module_hook($type, 'search_item')) { - $output = module_invoke($type, 'search_item', $item); + $output = '
'. check_plain($item['title']) .'
'; + $info = array(); + if ($item['type']) { + $info[] = $item['type']; } - else { - $output = '
'. check_plain($item['title']) .'
'; - $info = array(); - if ($item['type']) { - $info[] = $item['type']; - } - if ($item['user']) { - $info[] = $item['user']; - } - if ($item['date']) { - $info[] = format_date($item['date'], 'small'); - } - if (is_array($item['extra'])) { - $info = array_merge($info, $item['extra']); - } - $output .= '
'. ($item['snippet'] ? '

'. $item['snippet'] . '

' : '') . '

' . implode(' - ', $info) .'

'; + if ($item['user']) { + $info[] = $item['user']; } + if ($item['date']) { + $info[] = format_date($item['date'], 'small'); + } + if (is_array($item['extra'])) { + $info = array_merge($info, $item['extra']); + } + $output .= '
'. ($item['snippet'] ? '

'. $item['snippet'] . '

' : '') . '

' . implode(' - ', $info) .'

'; + return $output; +} + +/** + * Format the result page of a search query. + * + * Modules may implement hook_search_page() in order to override this default + * function to display search results. In that case it is expected they provide + * their own themable functions. + * + * @param $results + * All search result as returned by hook_search(). + * @param $type + * The type of item found, such as "user" or "node". + * + * @ingroup themeable + */ +function theme_search_page($results, $type) { + $output = '
'; + + foreach ($results as $entry) { + $output .= theme('search_item', $entry, $type); + } + $output .= '
'; + $output .= theme('pager', NULL, 15, 0); return $output; } diff --git a/modules/search/search.module b/modules/search/search.module index d2c6f5e768b..d7296037377 100644 --- a/modules/search/search.module +++ b/modules/search/search.module @@ -821,12 +821,16 @@ function _search_parse_query(&$word, &$scores, $not = false) { * @param $arguments2 * (optional) Extra SQL arguments belonging to the second query parameter. * + * @param $sort_parameters + * (optional) SQL arguments for sorting the final results. + * Default: 'ORDER BY score DESC' + * * @return * An array of SIDs for the search results. * * @ingroup search */ -function do_search($keywords, $type, $join1 = '', $where1 = '1', $arguments1 = array(), $select2 = 'i.relevance AS score', $join2 = '', $arguments2 = array()) { +function do_search($keywords, $type, $join1 = '', $where1 = '1', $arguments1 = array(), $select2 = 'i.relevance AS score', $join2 = '', $arguments2 = array(), $sort_parameters = 'ORDER BY score DESC') { $query = search_parse_query($keywords); if ($query[2] == '') { @@ -852,7 +856,7 @@ function do_search($keywords, $type, $join1 = '', $where1 = '1', $arguments1 = a // Second pass: only keep items that match the complicated keywords conditions (phrase search, negative keywords, ...) $conditions = '('. $query[0] .')'; $arguments = array_merge($arguments2, $query[1]); - $result = db_query_temporary("SELECT i.type, i.sid, $select2 FROM temp_search_sids i INNER JOIN {search_dataset} d ON i.sid = d.sid AND i.type = d.type $join2 WHERE $conditions ORDER BY score DESC", $arguments, 'temp_search_results'); + $result = db_query_temporary("SELECT i.type, i.sid, $select2 FROM temp_search_sids i INNER JOIN {search_dataset} d ON i.sid = d.sid AND i.type = d.type $join2 WHERE $conditions $sort_parameters", $arguments, 'temp_search_results'); if (($count = db_result(db_query('SELECT COUNT(*) FROM temp_search_results'))) == 0) { return array(); } @@ -862,7 +866,7 @@ function do_search($keywords, $type, $join1 = '', $where1 = '1', $arguments1 = a $result = pager_query("SELECT * FROM temp_search_results", 10, 0, $count_query, $arguments); $results = array(); while ($item = db_fetch_object($result)) { - $results[] = $item->sid; + $results[] = $item; } return $results; } @@ -1008,23 +1012,19 @@ function search_form($action = '', $keys = '', $type = null, $prompt = null) { * Perform a standard search on the given keys, and return the formatted results. */ function search_data($keys = NULL, $type = 'node') { - $output = ''; - if (isset($keys)) { if (module_hook($type, 'search')) { $results = module_invoke($type, 'search', 'search', $keys); if (isset($results) && is_array($results) && count($results)) { - $output .= '
'; - foreach ($results as $entry) { - $output .= theme('search_item', $entry, $type); + if (module_hook($type, 'search_page')) { + return module_invoke($type, 'search_page', $results); + } + else { + return theme('search_page', $results, $type); } - $output .= '
'; - $output .= theme('pager', NULL, 15, 0); } } } - - return $output; } /** @@ -1151,10 +1151,8 @@ function _search_excerpt_replace(&$text) { } /** - * Format a single result entry of a search query. - * - * Modules may implement hook_search_item() in order to override this default - * function to display search results. + * Format a single result entry of a search query. This function is normally + * called by theme_search_page() or hook_search_page(). * * @param $item * A single search result as returned by hook_search(). The result should be @@ -1167,26 +1165,46 @@ function _search_excerpt_replace(&$text) { * @ingroup themeable */ function theme_search_item($item, $type) { - if (module_hook($type, 'search_item')) { - $output = module_invoke($type, 'search_item', $item); + $output = '
'. check_plain($item['title']) .'
'; + $info = array(); + if ($item['type']) { + $info[] = $item['type']; } - else { - $output = '
'. check_plain($item['title']) .'
'; - $info = array(); - if ($item['type']) { - $info[] = $item['type']; - } - if ($item['user']) { - $info[] = $item['user']; - } - if ($item['date']) { - $info[] = format_date($item['date'], 'small'); - } - if (is_array($item['extra'])) { - $info = array_merge($info, $item['extra']); - } - $output .= '
'. ($item['snippet'] ? '

'. $item['snippet'] . '

' : '') . '

' . implode(' - ', $info) .'

'; + if ($item['user']) { + $info[] = $item['user']; } + if ($item['date']) { + $info[] = format_date($item['date'], 'small'); + } + if (is_array($item['extra'])) { + $info = array_merge($info, $item['extra']); + } + $output .= '
'. ($item['snippet'] ? '

'. $item['snippet'] . '

' : '') . '

' . implode(' - ', $info) .'

'; + return $output; +} + +/** + * Format the result page of a search query. + * + * Modules may implement hook_search_page() in order to override this default + * function to display search results. In that case it is expected they provide + * their own themable functions. + * + * @param $results + * All search result as returned by hook_search(). + * @param $type + * The type of item found, such as "user" or "node". + * + * @ingroup themeable + */ +function theme_search_page($results, $type) { + $output = '
'; + + foreach ($results as $entry) { + $output .= theme('search_item', $entry, $type); + } + $output .= '
'; + $output .= theme('pager', NULL, 15, 0); return $output; }