diff options
author | brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2009-10-22 18:20:10 +0000 |
---|---|---|
committer | brettp <brettp@36083f99-b078-4883-b0ff-0f9b5a30f544> | 2009-10-22 18:20:10 +0000 |
commit | b36bf0e97e8dfbf2dcd07d4173392a3dcfbc2df0 (patch) | |
tree | eadba4e265c097359389b866919201858c5ffdd5 /mod | |
parent | cb01252489f233535e2057457cfe90920f82f96d (diff) | |
download | elgg-b36bf0e97e8dfbf2dcd07d4173392a3dcfbc2df0.tar.gz elgg-b36bf0e97e8dfbf2dcd07d4173392a3dcfbc2df0.tar.bz2 |
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
Diffstat (limited to 'mod')
-rw-r--r-- | mod/search/index.php | 146 | ||||
-rw-r--r-- | mod/search/languages/en.php | 10 | ||||
-rw-r--r-- | mod/search/manifest.xml | 10 | ||||
-rw-r--r-- | mod/search/start.php | 116 | ||||
-rw-r--r-- | mod/search/views/default/page_elements/searchbox.php | 4 | ||||
-rw-r--r-- | mod/search/views/default/search/css.php | 67 | ||||
-rw-r--r-- | mod/search/views/default/search/entity_list.php | 66 | ||||
-rw-r--r-- | mod/search/views/default/search/gallery.php | 55 | ||||
-rw-r--r-- | mod/search/views/default/search/gallery_listing.php | 16 | ||||
-rw-r--r-- | mod/search/views/default/search/listing.php | 35 | ||||
-rw-r--r-- | mod/search/views/default/search/startblurb.php | 15 |
11 files changed, 540 insertions, 0 deletions
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 @@ +<?php + + /** Main search page */ + +global $CONFIG; + +$tag = get_input('tag'); +$offset = get_input('offset', 0); +$viewtype = get_input('search_viewtype','list'); +if ($viewtype == 'gallery') { + $limit = get_input('limit', 12); // 10 items in list view +} else { + $limit = get_input('limit', 10); // 12 items in gallery view +} +$searchtype = get_input('searchtype', 'all'); +$object_type = get_input('object_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); + + +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)) { + $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' => '<div>' . elgg_view('page_elements/searchbox') . '</div>')); + + +} +$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 @@ +<?php + + $language_array = array('search:enterterm' => '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 @@ +<?xml version="1.0" encoding="UTF-8"?> +<plugin_manifest> + <field key="author" value="Curverider Ltd, The MITRE Corporation" /> + <field key="version" value="1.7" /> + <field key="description" value="Allow search across entities of the site" /> + <field key="website" value="http://www.elgg.org/" /> + <field key="copyright" value="(C) Curverider 2008-2009, MITRE 2009" /> + <field key="licence" value="GNU Public License version 2" /> + <field key="elgg_version" value="2009030702" /> +</plugin_manifest>
\ 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 @@ +<?php + + /** + * Elgg core search. + * + * @package Elgg + * @subpackage Core + * @author Curverider Ltd <info@elgg.com>, The MITRE Corporation <http://www.mitre.org> + * @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 @@ +<form id="searchform" action="<?php echo $vars['url']; ?>pg/search/" method="get"> + <input type="text" size="21" name="tag" value="<?php echo elgg_echo('search'); ?>" onclick="if (this.value=='<?php echo elgg_echo('search'); ?>') { this.value='' }" class="search_input" /> + <input type="submit" value="<?php echo elgg_echo('search:go'); ?>" class="search_submit_button" /> +</form> 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 @@ +<?php +$context = $vars['context']; +$offset = $vars['offset']; +$entities = $vars['entities']; +$limit = $vars['limit']; +$count = $vars['count']; +$baseurl = $vars['baseurl']; +$context = $vars['context']; +$viewtype = $vars['viewtype']; +$pagination = $vars['pagination']; +$fullview = $vars['fullview']; + +$html = ""; +$nav = ""; +if (isset($vars['viewtypetoggle'])) { + $viewtypetoggle = $vars['viewtypetoggle']; +} else { + $viewtypetoggle = true; +} + +if ($context == "search" && $count > 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 @@ +<?php + + /** + * Elgg gallery view + * + * @package Elgg + * @subpackage Core + + * @author Curverider Ltd + + * @link http://elgg.org/ + */ + + $entities = $vars['entities']; + if (is_array($entities) && sizeof($entities) > 0) { + +?> + + <table class="entity_gallery"> + +<?php + + $col = 0; + foreach($entities as $entity) { + if ($col == 0) { + + echo "<tr>"; + + } + echo "<td class=\"entity_gallery_item\">"; + + $ev = elgg_view_entity($entity, $fullview); + + echo elgg_view('search/listing', array('entity_view' => $ev, + 'search_types' => $entity->getVolatileData('search'))); + + + echo "</td>"; + $col++; + if ($col > 3) { + echo "</tr>"; + $col = 0; + } + } + if ($col > 0) echo "</tr>"; + +?> + + </table> + +<?php + + } + +?>
\ 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 @@ +<?php +/** + * Elgg search listing: gallery view + * + * DEPRECATED VIEW: use entities/gallery_listing instead + * + * @package Elgg + * @subpackage Core + * @author Curverider Ltd + * @link http://elgg.org/ + */ + + + echo elgg_view('entities/gallery_listing', $vars); + +?>
\ 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 @@ +<?php + + /** + * Elgg search listing + * + * @package Elgg + * @subpackage Core + + * @author Curverider Ltd + + * @link http://elgg.org/ + */ + +?> + + <div class="search_listing"> + +<?php + +echo $vars['entity_view']; + +if ($vars['search_types'] && is_array($vars['search_types'])) { + echo '<div class="searchtypes">' . elgg_echo('search:matched'); + foreach ($vars['search_types'] as $st) { + echo '<span class="searchtype">' . elgg_echo($st) . '</span> '; + } + echo '</div>'; + +} + + + + +?> + </div> 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 @@ +<?php +/** + * @package Elgg + * @subpackage Core + * @author Curverider Ltd + * @link http://elgg.org/ + */ +?> +<div class="contentWrapper"> + <?php + + echo sprintf(elgg_echo("tag:search:startblurb"),$vars['tag']); + + ?> +</div>
\ No newline at end of file |