1<?php 2 3/** 4 * Elgg search page 5 */ 6 7// Search supports RSS 8elgg_register_rss_link(); 9 10// This magic is needed to support /search/<query> 11// but have /search/<query1>?q=<query2> as <query2> be the main search query 12set_input('q', get_input('q', elgg_extract('route_query', $vars, null, false))); 13 14$service = new \Elgg\Search\Search(); 15$params = $service->getParams(); 16 17$container_guid = elgg_extract('container_guid', $params); 18if ($container_guid && !is_array($container_guid)) { 19 elgg_entity_gatekeeper($container_guid); 20 21 elgg_set_page_owner_guid($container_guid); 22} 23 24$query = elgg_extract('query', $params); 25 26$form = elgg_view_form('search', [ 27 'action' => elgg_generate_url('default:search'), 28 'method' => 'get', 29 'disable_security' => true, 30 'prevent_double_submit' => true, 31], $params); 32 33if (!preg_match('/[\pL\pN]+/', $query)) { 34 $form .= elgg_view_message('warning', elgg_echo('search:empty_query'), ['title' => false]); 35 36 // display a search form if there is no query 37 echo elgg_view_page(elgg_echo('search'), [ 38 'content' => $form, 39 ]); 40 41 return; 42} 43 44$highlighted_query = $service->getHighlighter()->highlightWords($query); 45$title = elgg_echo('search:results', ["\"$highlighted_query\""]); 46 47$use_type = function ($search_type, $type = null, $subtype = null) use ($params) { 48 49 if ($params['search_type'] == 'all') { 50 return true; 51 } 52 53 switch ($params['search_type']) { 54 case 'entities' : 55 if ($params['type'] && $params['type'] != $type) { 56 return false; 57 } else if ($params['subtype'] && $params['subtype'] !== $subtype) { 58 return false; 59 } 60 61 return true; 62 63 // custom search type 64 default : 65 return $params['search_type'] == $search_type; 66 } 67}; 68 69$total = 0; 70$results = ''; 71 72$types = $service->getTypeSubtypePairs(); 73foreach ($types as $type => $subtypes) { 74 if (empty($subtypes) || !is_array($subtypes)) { 75 continue; 76 } 77 78 foreach ($subtypes as $subtype) { 79 $count = $service->listResults('entities', $type, $subtype, true); 80 $total += $count; 81 elgg_register_menu_item('page', [ 82 'name' => "item:$type:$subtype", 83 'text' => elgg_echo("item:$type:$subtype"), 84 'href' => elgg_generate_url('default:search', [ 85 'q' => $params['query'], 86 'entity_type' => $type, 87 'entity_subtype' => $subtype, 88 'owner_guid' => $params['owner_guid'], 89 'search_type' => 'entities', 90 ]), 91 'badge' => $count, 92 ]); 93 94 if ($use_type('entities', $type, $subtype)) { 95 $results .= $service->listResults('entities', $type, $subtype); 96 } 97 } 98} 99 100$custom_types = $service->getSearchTypes(); 101foreach ($custom_types as $search_type) { 102 $count = $service->listResults($search_type, null, null, true); 103 $total += $count; 104 elgg_register_menu_item('page', [ 105 'name' => "search_types:{$search_type}", 106 'text' => elgg_echo("search_types:{$search_type}"), 107 'href' => elgg_generate_url('default:search', [ 108 'q' => $params['query'], 109 'search_type' => $search_type, 110 ]), 111 'badge' => $count, 112 ]); 113 114 if ($use_type($search_type)) { 115 $results .= $service->listResults($search_type); 116 } 117} 118 119elgg_register_menu_item('page', [ 120 'name' => 'all', 121 'text' => elgg_echo('all'), 122 'href' => elgg_generate_url('default:search', [ 123 'q' => $params['query'], 124 'owner_guid' => $params['owner_guid'], 125 'search_type' => 'all', 126 ]), 127 'badge' => $total, 128 'priority' => 1, 129]); 130 131if (empty($results)) { 132 $results = elgg_view('page/components/no_results', [ 133 'no_results' => elgg_echo('notfound'), 134 ]); 135} 136 137echo elgg_view_page(elgg_echo('search'), [ 138 'title' => $title, 139 'content' => $form . $results, 140]); 141