<?php
- /** Main search page */
+// $search_type == all || entities || trigger plugin hook
+$search_type = get_input('search_type', 'all');
+$query = sanitise_string(get_input('query', get_input('tag')));
+
+// get limit and offset. override if on search dashboard, where only 2
+// of each most recent entity types will be shown.
+$limit = ($search_type == 'all') ? 2 : get_input('limit', 10);
+$offset = ($search_type == 'all') ? 0 : get_input('offset', 0);
+
+$type = get_input('type', '');
+$subtype = get_input('subtype', '');
+$owner_guid = get_input('owner_guid', NULL);
+$friends = (int)get_input('friends', 0);
+
+// set up search params
+$params = array(
+ 'query' => $query,
+ 'offset' => $offset,
+ 'limit' => $limit,
+ 'search_type' => $search_type,
+ 'type' => $type,
+ 'subtype' => $subtype,
+ 'tag_type' => $tag_type,
+ 'owner_guid' => $owner_guid,
+ 'friends' => $friends
+);
+
+$results_html = '';
+if ($search_type == 'entities' || $search_type == 'all') {
+ $types = get_registered_entity_types();
+
+ // to pass the correct search type to the views
+ $params['search_type'] = 'entities';
+
+ // foreach through types.
+ // if a plugin returns FALSE for subtype ignore it.
+ // if a plugin returns NULL or '' for subtype, pass to generic type search function.
+ // if still NULL or '' or empty(array()) no results found. (== don't show??)
+ foreach ($types as $type => $subtypes) {
+ if (is_array($subtypes) && count($subtypes)) {
+ foreach ($subtypes as $subtype) {
+ $params['subtype'] = $subtype;
+ $params['type'] = $type;
+
+ $entities = trigger_plugin_hook('search', "$type:$subtype", $params, NULL);
+ if ($entities === FALSE) {
+ // someone is saying not to display these types in searches.
+ continue;
+ } elseif (is_array($entities) && !count($entities)) {
+ // no results, but results searched in hook.
+ } elseif (!$entities) {
+ // no results and not hooked. use default type search.
+ // don't change the params here, since it's really a different subtype.
+ // Will be passed to elgg_get_entities().
+ $results = trigger_plugin_hook('search', $type, $params, array());
+ }
+
+ if (is_array($results['entities']) && $results['count']) {
+ $results_html .= search_get_listing_html($results['entities'], $results['count'], $params);
+ }
+ }
+ }
+
+ // pull in default type entities with no subtypes
+ // @todo this might currently means "all entities regardless of subtype"
+ $params['type'] = $type;
+ $params['subtype'] = 0;
+
+ $results = trigger_plugin_hook('search', $type, $params, array());
+ if ($results === FALSE) {
+ // someone is saying not to display these types in searches.
+ continue;
+ }
+
+ if (is_array($results['entities']) && $results['count']) {
+ $results_html .= search_get_listing_html($results['entities'], $results['count'], $params);
+ }
+ }
+}
+
+// call custom searches
+if ($search_type == 'all' || $search_type != 'entities') {
+ // get custom search types
+ $types = trigger_plugin_hook('search_types', 'get_types', $params, array());
+
+ if (is_array($types)) {
+ foreach ($types as $type) {
+ $params['search_type'] = $type;
+ unset($params['subtype']);
+
+ $results = trigger_plugin_hook('search', $type, $params, array());
+
+ if ($results === FALSE) {
+ // someone is saying not to display these types in searches.
+ continue;
+ }
+
+ if (is_array($results['entities']) && $results['count']) {
+ $results_html .= search_get_listing_html($results['entities'], $results['count'], $params);
+ }
+ }
+ }
+}
+
+//if ($search_type !== 'all') {
+// var_dump('here');
+// $entities = trigger_plugin_hook('search', $search_type, '', $return);
+//}
+/*
+
+call search_section_start to display long bar with types and titles
+call search
+
+
+
+*/
+
+$layout = elgg_view_layout('single_column', '', $results_html);
+
+page_draw($title, $layout);
+
+
+
+
+
+
+
+return;
+
+
+/** Main search page */
global $CONFIG;
$offset = get_input('offset', 0);
$viewtype = get_input('search_viewtype','list');
if ($viewtype == 'gallery') {
- $limit = get_input('limit', 12); // 10 items in list view
+ $limit = get_input('limit', 12); // 10 items in list view
} else {
- $limit = get_input('limit', 10); // 12 items in gallery view
+ $limit = get_input('limit', 10); // 12 items in gallery view
}
$searchtype = get_input('searchtype', 'all');
-$object_type = get_input('object_type', '');
+$type = get_input('type', '');
$subtype = get_input('subtype', '');
$owner_guid = get_input('owner_guid', '');
$tagtype = get_input('tagtype', '');
$friends = (int)get_input('friends', 0);
+$title = sprintf(elgg_echo('searchtitle'), $tag);
-
-$title = sprintf(elgg_echo('searchtitle'), $tag);
-
-
-if (substr_count($owner_guid,',')) {
- $owner_guid_array = explode(",",$owner_guid);
+if (substr_count($owner_guid, ',')) {
+ $owner_guid_array = explode(',', $owner_guid);
} else {
$owner_guid_array = $owner_guid;
}
if ($friends > 0) {
- if ($friends = get_user_friends($friends,'',9999)) {
+ if ($friends = get_user_friends($friends, '', 9999)) {
$owner_guid_array = array();
foreach($friends as $friend) {
$owner_guid_array[] = $friend->guid;
}
// Set up submenus
-if ($object_types = get_registered_entity_types()) {
-
- foreach($object_types as $ot => $subtype_array) {
- if (is_array($subtype_array) && sizeof($subtype_array))
+if ($types = get_registered_entity_types()) {
+ foreach($types as $ot => $subtype_array) {
+ if (is_array($subtype_array) && count($subtype_array)) {
foreach($subtype_array as $object_subtype) {
$label = 'item:' . $ot;
- if (!empty($object_subtype)) $label .= ':' . $object_subtype;
- add_submenu_item(elgg_echo($label), $CONFIG->wwwroot . "pg/search/?tag=". urlencode($tag) ."&subtype=" . $object_subtype . "&object_type=". urlencode($ot) ."&tagtype=" . urlencode($md_type) . "&owner_guid=" . urlencode($owner_guid));
+ if (!empty($object_subtype)) {
+ $label .= ':' . $object_subtype;
+ }
+
+ $data = http_build_query(array(
+ 'tag' => urlencode($tag),
+ 'subtype' => $object_subtype,
+ 'type' => urlencode($ot),
+ //'tagtype' => urlencode($md_type),
+ 'owner_guid' => urlencode($owner_guid)
+ ));
+
+ $url = "{$CONFIG->wwwroot}pg/search/?$data";
+
+ add_submenu_item(elgg_echo($label), $url);
}
+ }
}
- add_submenu_item(elgg_echo('all'), $CONFIG->wwwroot . "pg/search/?tag=". urlencode($tag) ."&owner_guid=" . urlencode($owner_guid));
-
+
+ $data = http_build_query(array(
+ 'tag' => urlencode($tag),
+ 'owner_guid' => urlencode($owner_guid)
+ ));
+
+ add_submenu_item(elgg_echo('all'), "{$CONFIG->wwwroot}pg/search/?$data");
+}
+
+// pull in search types for external or aggregated searches.
+if ($search_types = trigger_plugin_hook('search', 'types', '', NULL, array())) {
+
}
$body = '';
if (!empty($tag)) {
+ // start with blank results.
+ $results = array(
+ 'entities' => array(),
+ 'total' => 0
+ );
+
+ // do the actual searchts
+ $params = array(
+ 'tag' => $tag,
+ 'offset' => $offset,
+ 'limit' => $limit,
+ 'searchtype' => $searchtype,
+ 'type' => $type,
+ 'subtype' => $subtype,
+ 'tagtype' => $tagtype,
+ 'owner_guid' => $owner_guid_array
+ );
+
+ $results = trigger_plugin_hook('search', 'entities', $params, $results);
- // blank the results to start off
- $results = new stdClass();
- $results->entities = array();
- $results->total = 0;
-
- // do the actual search
- $results = trigger_plugin_hook('search:entities', '', array('tag' => $tag,
- 'offset' => $offset,
- 'limit' => $limit,
- 'searchtype' => $searchtype,
- 'object_type' => $object_type,
- 'subtype' => $subtype,
- 'tagtype' => $tagtype,
- 'owner_guid' => $owner_guid_array
- ),
- $results);
-
- /* // this piece is for future work, to setup submenus for searchtypes
- $searchtypes = trigger_plugin_hook('search:types', '', NULL, array());
- add_submenu_item(elgg_echo('search:type:all'),
- $CONFIG->wwwroot . "pg/search/?tag=". urlencode($tag) ."&searchtype=all");
-
- foreach ($searchtypes as $st) {
- add_submenu_item(elgg_echo('search:type:' . $st),
- $CONFIG->wwwroot . "pg/search/?tag=". urlencode($tag) ."&searchtype=" . $st);
- }
- */
-
-
- if (empty($objecttype) && empty($subtype)) {
- $title = sprintf(elgg_echo('searchtitle'),$tag);
+ if (empty($type) && empty($subtype)) {
+ $title = sprintf(elgg_echo('searchtitle'),$tag);
} else {
- if (empty($objecttype)) $objecttype = 'object';
- $itemtitle = 'item:' . $objecttype;
- if (!empty($subtype)) $itemtitle .= ':' . $subtype;
+ if (empty($type)) {
+ $type = 'object';
+ }
+ $itemtitle = 'item:' . $type;
+ if (!empty($subtype)) {
+ $itemtitle .= ':' . $subtype;
+ }
$itemtitle = elgg_echo($itemtitle);
$title = sprintf(elgg_echo('advancedsearchtitle'),$itemtitle,$tag);
}
-
-
-
-
- //print_r($results);
$body .= elgg_view_title($title); // elgg_view_title(sprintf(elgg_echo('searchtitle'),$tag));
// call the old (now-deprecated) search hook here
$body .= trigger_plugin_hook('search','',$tag, '');
- $body .= elgg_view('search/startblurb', array('tag' => $tag));
+ $body .= elgg_view('search/startblurb', array('query' => $query));
if ($results->total > 0) {
-
-
- $body .= elgg_view('search/entity_list', array('entities' => $results->entities,
- 'count' => $results->total,
- 'offset' => $offset,
- 'limit' => $limit,
- 'baseurl' => $_SERVER['REQUEST_URI'],
- 'fullview' => false,
- 'context' => 'search',
- 'viewtypetoggle' => true,
- 'viewtype' => $viewtype,
- 'pagination' => true
- ));
+ $body .= elgg_view('search/entity_list', array(
+ 'entities' => $results->entities,
+ 'count' => $results->total,
+ 'offset' => $offset,
+ 'limit' => $limit,
+ 'baseurl' => $_SERVER['REQUEST_URI'],
+ 'fullview' => false,
+ 'context' => 'search',
+ 'viewtypetoggle' => true,
+ 'viewtype' => $viewtype,
+ 'pagination' => true
+ ));
} else {
- $body .= elgg_view('page_elements/contentwrapper', array('body' => elgg_echo('search:noresults')));
+ $body .= elgg_view('page_elements/contentwrapper', array('body' => elgg_echo('search:noresults')));
}
-
-
-
elgg_view_entity_list($results->entities, count($results->entities), 0, count($results->entities), false);
} else {
// if no tag was given, give the user a box to input a search term
$body .= elgg_view_title(elgg_echo('search:enterterm'));
$body .= elgg_view('page_elements/contentwrapper', array('body' => '<div>' . elgg_view('page_elements/searchbox') . '</div>'));
-
-
}
-$layout = elgg_view_layout('two_column_left_sidebar','',$body);
-
-
-page_draw($title, $layout);
+$layout = elgg_view_layout('two_column_left_sidebar','',$body);
-?>
\ No newline at end of file
+page_draw($title, $layout);
\ No newline at end of file
<?php
- /**
+/**
* Elgg core search.
- *
+ *
* @package Elgg
* @subpackage Core
* @author Curverider Ltd <info@elgg.com>, The MITRE Corporation <http://www.mitre.org>
*
*/
function search_init() {
- global $CONFIG;
-
// page handler for search actions and results
register_page_handler('search','search_page_handler');
- // hook into the search callback to use the metadata system (this is the part that will go away!)
- register_plugin_hook('search:entities', 'all', 'search_original_hook');
-
- // list of available search types should include our base parts
- register_plugin_hook('searchtypes', 'all', 'search_base_search_types_hook');
-
// add in CSS for search elements
extend_view('css', 'search/css');
}
-
+
/**
* Page handler for search
*
*/
function search_page_handler($page) {
global $CONFIG;
-
+
if(!get_input('tag')) {
- set_input('tag', $page[0]);
+ set_input('tag', $page[0]);
}
include_once($CONFIG->path . "mod/search/index.php");
/**
* Core search hook.
* Returns an object with two parts:
- * ->entities: an array of instantiated entities that have been decorated with
+ * ->entities: an array of instantiated entities that have been decorated with
* volatile "search" data indicating what they matched. These are
* the entities to be displayed to the user on this page.
* ->total: total number of entities overall. This function can update this
* limit to ask for more pages in the pagination.
*/
function search_original_hook($hook, $type, $returnvalue, $params) {
+ global $CONFIG;
+
+ var_dump($CONFIG->hooks);
+
$tag = $params['tag'];
$offset = $params['offset']; // starting page
$limit = $params['limit']; // number per page
$owner_guid = $params['owner_guid'];
$tagtype = $params['tagtype'];
- $count = get_entities_from_metadata($tagtype, elgg_strtolower($tag), $object_type, $subtype, $owner_guid, $limit, $offset, "", 0, TRUE, FALSE);
+ $count = get_entities_from_metadata($tagtype, elgg_strtolower($tag), $object_type, $subtype, $owner_guid, $limit, $offset, "", 0, TRUE, FALSE);
$ents = get_entities_from_metadata($tagtype, elgg_strtolower($tag), $object_type, $subtype, $owner_guid, $limit, $offset, "", 0, FALSE, FALSE);
+// $options = array(
+// 'metadata_name_value_pair' => array('name' => $params['tagtype'], 'value' => $params['tag'], 'case_sensitive' => false),
+// 'offset' => $params['offset'],
+// 'limit' => $params['limit'],
+// 'type' => $params['object_type'],
+// 'subtype' => $params['subtype'],
+// 'owner_guid' => $params['owner_guid']
+// );
+//
+// $count = elgg_get_entities_from_metadata(array_merge($options, array('count' => TRUE)));
+// $entities = elgg_get_entities_from_metadata($options);
+
/*
* Foreach entity
* get the metadata keys
return $returnvalue;
}
+/**
+ * Provides default search for registered entity subtypes.
+ * Entity types should be dealt with in the entity classes. (Objects are an exception).
+ *
+ * @param unknown_type $hook
+ * @param unknown_type $type
+ * @param unknown_type $returnvalue
+ * @param unknown_type $params
+ * @return unknown_type
+ */
+function search_registered_entities($hook, $type, $returnvalue, $params) {
+ $entity_types = get_registered_entity_types();
+ foreach ($entity_types as $type => $subtypes) {
+ if (is_array($subtypes) && count($subtypes)) {
+
+ }
+
+ }
+}
+
/**
* return our base search types (right now, we have none)
*/
return $returnvalue;
}
-/** Register init system event **/
-register_elgg_event_handler('init','system','search_init');
+/**
+ * Returns a matching string with $context amount of context, optionally
+ * surrounded by $before and $after.
+ *
+ * If no match is found, restricts string to $context*2 starting from strpos 0.
+ *
+ * @param str $haystack
+ * @param str $needle
+ * @param str $before
+ * @param str $after
+ * @param str $context
+ * @return str
+ */
+function search_get_relevant_substring($haystack, $needle, $before = '', $after = '', $context = 75) {
+ $haystack = strip_tags($haystack);
+ $needle = strip_tags($needle);
+
+ $pos = strpos(strtolower($haystack), strtolower($needle));
+
+ if ($pos === FALSE) {
+ $str = substr($haystack, 0, $context*2);
+ if (strlen($haystack) > $context*2) {
+ $str .= '...';
+ }
+
+ return $str;
+ }
+
+ $start_pos = $pos - $context;
+
+ if ($start_pos < 0) {
+ $start_pos = 0;
+ }
+
+ // get string from -context to +context
+ $matched = substr($haystack, $start_pos, $context*2);
+
+ // add elipses to front.
+ if ($start_pos > 0) {
+ $matched = "...$matched";
+ }
+
+ // add elipses to end.
+ if ($start_pos + $context < strlen($haystack)) {
+ $matched = "$matched...";
+ }
+
+ // surround if needed
+ if ($before || $after) {
+ $matched = str_ireplace($needle, $before . $needle . $after, $matched);
+ }
+
+ return $matched;
+}
+
+
+
+function search_get_listing_html($entities, $count, $params) {
+ if (!is_array($entities) || !$count) {
+ return FALSE;
+ }
+
+ $view_order = array();
+
+ // check if there's a special search view for this type:subtype
+ if (isset($params['type']) && $params['type'] && isset($params['subtype']) && $params['subtype']) {
+ $view_order[] = "search/{$params['type']}/{$params['subtype']}/listing";
+ }
+
+ // also check for the default type
+ if (isset($params['type']) && $params['type']) {
+ $view_order[] = "search/{$params['type']}/listing";
+ }
+
+ // check search types
+ if (isset($params['search_type']) && $params['search_type']) {
+ $view_order[] = "search/{$params['search_type']}/listing";
+ }
+
+ // finally default to a search listing default
+ $view_order[] = "search/listing";
+
+ $vars = array(
+ 'entities' => $entities,
+ 'count' => $count,
+ 'params' => $params
+ );
+
+ foreach ($view_order as $view) {
+ if (elgg_view_exists($view)) {
+ return elgg_view($view, $vars);
+ }
+ }
+
+ return FALSE;
+}
+
+/** Register init system event **/
-?>
+register_elgg_event_handler('init','system','search_init');
\ No newline at end of file