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;
}