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