From b36bf0e97e8dfbf2dcd07d4173392a3dcfbc2df0 Mon Sep 17 00:00:00 2001 From: brettp Date: Thu, 22 Oct 2009 18:20:10 +0000 Subject: Pulling in MITRE's search core. Fo'rizzle this time. Yo. git-svn-id: http://code.elgg.org/elgg/trunk@3572 36083f99-b078-4883-b0ff-0f9b5a30f544 --- mod/search/index.php | 146 +++++++++++++++++++++ mod/search/languages/en.php | 10 ++ mod/search/manifest.xml | 10 ++ mod/search/start.php | 116 ++++++++++++++++ .../views/default/page_elements/searchbox.php | 4 + mod/search/views/default/search/css.php | 67 ++++++++++ mod/search/views/default/search/entity_list.php | 66 ++++++++++ mod/search/views/default/search/gallery.php | 55 ++++++++ .../views/default/search/gallery_listing.php | 16 +++ mod/search/views/default/search/listing.php | 35 +++++ mod/search/views/default/search/startblurb.php | 15 +++ 11 files changed, 540 insertions(+) create mode 100644 mod/search/index.php create mode 100644 mod/search/languages/en.php create mode 100644 mod/search/manifest.xml create mode 100644 mod/search/start.php create mode 100644 mod/search/views/default/page_elements/searchbox.php create mode 100644 mod/search/views/default/search/css.php create mode 100644 mod/search/views/default/search/entity_list.php create mode 100644 mod/search/views/default/search/gallery.php create mode 100644 mod/search/views/default/search/gallery_listing.php create mode 100644 mod/search/views/default/search/listing.php create mode 100644 mod/search/views/default/search/startblurb.php (limited to 'mod') diff --git a/mod/search/index.php b/mod/search/index.php new file mode 100644 index 000000000..7cbf6121c --- /dev/null +++ b/mod/search/index.php @@ -0,0 +1,146 @@ + 0) { + if ($friends = get_user_friends($friends,'',9999)) { + $owner_guid_array = array(); + foreach($friends as $friend) { + $owner_guid_array[] = $friend->guid; + } + } else { + $owner_guid = -1; + } +} + +// 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)) + 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)); + } + } + add_submenu_item(elgg_echo('all'), $CONFIG->wwwroot . "pg/search/?tag=". urlencode($tag) ."&owner_guid=" . urlencode($owner_guid)); + +} + +$body = ''; +if (!empty($tag)) { + + // 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); + } else { + if (empty($objecttype)) $objecttype = 'object'; + $itemtitle = 'item:' . $objecttype; + 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)); + + 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 + )); + } else { + $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' => '
' . elgg_view('page_elements/searchbox') . '
')); + + +} +$layout = elgg_view_layout('two_column_left_sidebar','',$body); + + +page_draw($title, $layout); + + +?> \ No newline at end of file diff --git a/mod/search/languages/en.php b/mod/search/languages/en.php new file mode 100644 index 000000000..52c29c7ed --- /dev/null +++ b/mod/search/languages/en.php @@ -0,0 +1,10 @@ + 'Enter a search term:', + 'search:noresults' => 'No results.', + 'search:matched' => 'Matched: ' + ); + +add_translation('en', $language_array); + +?> diff --git a/mod/search/manifest.xml b/mod/search/manifest.xml new file mode 100644 index 000000000..1f8415445 --- /dev/null +++ b/mod/search/manifest.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mod/search/start.php b/mod/search/start.php new file mode 100644 index 000000000..24b038c7a --- /dev/null +++ b/mod/search/start.php @@ -0,0 +1,116 @@ +, The MITRE Corporation + * @link http://elgg.org/ + */ + +/** + * Initialise search helper functions. + * + */ +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 + * + * @param array $page Page elements from pain page handler + */ +function search_page_handler($page) { + global $CONFIG; + + if(!get_input('tag')) { + 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 + * 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) { + $tag = $params['tag']; + $offset = $params['offset']; // starting page + $limit = $params['limit']; // number per page + $searchtype = $params['searchtype']; // the search type we're looking for + $object_type = $params['object_type']; + $subtype = $params['subtype']; + $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); + $ents = get_entities_from_metadata($tagtype, elgg_strtolower($tag), $object_type, $subtype, $owner_guid, $limit, $offset, "", 0, FALSE, FALSE); + + /* + * Foreach entity + * get the metadata keys + * If the value matches, hang onto the key + * add all the matched keys to VolatileData + * This tells us *why* each entity matched + */ + foreach ($ents as $ent) { + $metadata = get_metadata_for_entity($ent->getGUID()); + $matched = array(); + if ($metadata) { + foreach ($metadata as $tuple) { + if ($tag === $tuple->value) { + // This is one of the matching elements + $matched[] = $tuple->name; + } + } + $ent->setVolatileData('search', $matched); + } + } + + // merge in our entities with any coming in from elsewhere + $returnvalue->entities = array_merge($returnvalue->entities, $ents); + + // expand the total entity count if necessary + if ($count > $returnvalue->total) { + $returnvalue->total = $count; + } + + return $returnvalue; +} + +/** + * return our base search types (right now, we have none) + */ +function search_base_search_types_hook($hook, $type, $returnvalue, $params) { + if (!is_array($returnvalue)) { + $returnvalue = array(); + } + + return $returnvalue; +} + +/** Register init system event **/ + +register_elgg_event_handler('init','system','search_init'); + +?> diff --git a/mod/search/views/default/page_elements/searchbox.php b/mod/search/views/default/page_elements/searchbox.php new file mode 100644 index 000000000..4bab36be9 --- /dev/null +++ b/mod/search/views/default/page_elements/searchbox.php @@ -0,0 +1,4 @@ +
+ + +
diff --git a/mod/search/views/default/search/css.php b/mod/search/views/default/search/css.php new file mode 100644 index 000000000..27b532727 --- /dev/null +++ b/mod/search/views/default/search/css.php @@ -0,0 +1,67 @@ +.searchtype { +background: #FFFACD; +color: black; +} + +.searchtypes { +border: 1px #EEEEEE solid; +padding: 4px; +margin: 6px; +} + +#searchform input.search_input { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + background-color:#FFFFFF; + border:1px solid #BBBBBB; + color:#999999; + font-size:12px; + font-weight:bold; + margin:0pt; + padding:2px; + width:180px; + height:12px; +} +#searchform input.search_submit_button { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + color:#333333; + background: #cccccc; + border:none; + font-size:12px; + font-weight:bold; + margin:0px; + padding:2px; + width:auto; + height:18px; + cursor:pointer; +} +#searchform input.search_submit_button:hover { + color:#ffffff; + background: #4690d6; +} + + +.search_listing { + display: block; + -webkit-border-radius: 8px; + -moz-border-radius: 8px; + background:white; + margin:0 10px 5px 10px; + padding:5px; +} + +.entity_gallery_item .search_listing { + background: none; + text-align: center; +} + +/* override the entity container piece */ +.search_listing .entity_listing { + -webkit-border-radius: 0px; + -moz-border-radius: 0px; + background: transparent; + margin: 0; + padding: 0; +} + diff --git a/mod/search/views/default/search/entity_list.php b/mod/search/views/default/search/entity_list.php new file mode 100644 index 000000000..d709210df --- /dev/null +++ b/mod/search/views/default/search/entity_list.php @@ -0,0 +1,66 @@ + 0 && $viewtypetoggle) { + $nav .= elgg_view("navigation/viewtype",array( + + 'baseurl' => $baseurl, + 'offset' => $offset, + 'count' => $count, + 'viewtype' => $viewtype, + + )); +} + +if ($pagination) + $nav .= elgg_view('navigation/pagination',array( + + 'baseurl' => $baseurl, + 'offset' => $offset, + 'count' => $count, + 'limit' => $limit, + + )); + +$html .= $nav; + +if ($viewtype == "list") { + if (is_array($entities) && sizeof($entities) > 0) { + foreach($entities as $entity) { + // print out the entity + $ev = elgg_view_entity($entity, $fullview); + // then add the search decorations around it + $html .= elgg_view('search/listing', array('entity_view' => $ev, + 'search_types' => $entity->getVolatileData('search'))); + + } + } +} else if ($viewtype == "gallery") { + if (is_array($entities) && sizeof($entities) > 0) { + $html .= elgg_view("search/gallery",array('entities' => $entities)); + } +} + +if ($count) { + $html .= $nav; +} +echo $html; + +?> diff --git a/mod/search/views/default/search/gallery.php b/mod/search/views/default/search/gallery.php new file mode 100644 index 000000000..753a38684 --- /dev/null +++ b/mod/search/views/default/search/gallery.php @@ -0,0 +1,55 @@ + 0) { + +?> + + + +"; + + } + echo ""; + $col++; + if ($col > 3) { + echo ""; + $col = 0; + } + } + if ($col > 0) echo ""; + +?> + + + + \ No newline at end of file diff --git a/mod/search/views/default/search/gallery_listing.php b/mod/search/views/default/search/gallery_listing.php new file mode 100644 index 000000000..bbecaf202 --- /dev/null +++ b/mod/search/views/default/search/gallery_listing.php @@ -0,0 +1,16 @@ + \ No newline at end of file diff --git a/mod/search/views/default/search/listing.php b/mod/search/views/default/search/listing.php new file mode 100644 index 000000000..e3ad91ba8 --- /dev/null +++ b/mod/search/views/default/search/listing.php @@ -0,0 +1,35 @@ + + +
+ +' . elgg_echo('search:matched'); + foreach ($vars['search_types'] as $st) { + echo '' . elgg_echo($st) . ' '; + } + echo '
'; + +} + + + + +?> + diff --git a/mod/search/views/default/search/startblurb.php b/mod/search/views/default/search/startblurb.php new file mode 100644 index 000000000..0115438f2 --- /dev/null +++ b/mod/search/views/default/search/startblurb.php @@ -0,0 +1,15 @@ + +
+ +
\ No newline at end of file -- cgit v1.2.3