search::main()   F
last analyzed

Complexity

Conditions 26
Paths 10813

Size

Total Lines 205

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 205
rs 0
c 0
b 0
f 0
cc 26
nc 10813
nop 1

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
*
4
* phpBB Directory extension for the phpBB Forum Software package.
5
*
6
* @copyright (c) 2014 ErnadoO <https://www.phpbb-services.com>
7
* @license GNU General Public License, version 2 (GPL-2.0)
8
*
9
*/
10
11
namespace ernadoo\phpbbdirectory\controller;
12
13
use \ernadoo\phpbbdirectory\core\helper;
14
15
class search extends helper
16
{
17
18
	/** @var \phpbb\db\driver\driver_interface */
19
	protected $db;
20
21
	/** @var \phpbb\config\config */
22
	protected $config;
23
24
	/** @var \phpbb\language\language */
25
	protected $language;
26
27
	/** @var \phpbb\template\template */
28
	protected $template;
29
30
	/** @var \phpbb\user */
31
	protected $user;
32
33
	/** @var \phpbb\controller\helper */
34
	protected $helper;
35
36
	/** @var \phpbb\request\request */
37
	protected $request;
38
39
	/** @var \phpbb\auth\auth */
40
	protected $auth;
41
42
	/** @var \phpbb\pagination */
43
	protected $pagination;
44
45
	/** @var \ernadoo\phpbbdirectory\search\fulltext_directory */
46
	protected $search;
47
48
	/** @var \ernadoo\phpbbdirectory\core\categorie */
49
	protected $categorie;
50
51
	/** @var \ernadoo\phpbbdirectory\core\link */
52
	protected $link;
53
54
	/**
55
	* Constructor
56
	*
57
	* @param \phpbb\db\driver\driver_interface 					$db				Database object
58
	* @param \phpbb\config\config 								$config			Config object
59
	* @param \phpbb\language\language							$language		Language object
60
	* @param \phpbb\template\template 							$template		Template object
61
	* @param \phpbb\user 										$user			User object
62
	* @param \phpbb\controller\helper 							$helper			Controller helper object
63
	* @param \phpbb\request\request 							$request		Request object
64
	* @param \phpbb\auth\auth 									$auth			Auth object
65
	* @param \phpbb\pagination 									$pagination		Pagination object
66
	* @param \ernadoo\phpbbdirectory\search\fulltext_directory	$search			PhpBB Directory extension search object
67
	* @param \ernadoo\phpbbdirectory\core\categorie				$categorie		PhpBB Directory extension categorie object
68
	* @param \ernadoo\phpbbdirectory\core\link					$link			PhpBB Directory extension link object
69
	*/
70 View Code Duplication
	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\config\config $config, \phpbb\language\language $language, \phpbb\template\template $template, \phpbb\user $user, \phpbb\controller\helper $helper, \phpbb\request\request $request, \phpbb\auth\auth $auth, \phpbb\pagination $pagination, \ernadoo\phpbbdirectory\search\fulltext_directory $search, \ernadoo\phpbbdirectory\core\categorie $categorie, \ernadoo\phpbbdirectory\core\link $link)
71
	{
72
		$this->db			= $db;
73
		$this->config		= $config;
74
		$this->language		= $language;
75
		$this->template		= $template;
76
		$this->user			= $user;
77
		$this->helper		= $helper;
78
		$this->request		= $request;
79
		$this->auth			= $auth;
80
		$this->pagination	= $pagination;
81
		$this->search		= $search;
82
		$this->categorie	= $categorie;
83
		$this->link			= $link;
84
85
		$language->add_lang('directory', 'ernadoo/phpbbdirectory');
86
		$language->add_lang('search');
87
88
		$template->assign_vars(array(
89
			'S_PHPBB_DIRECTORY'	=> true,
90
		));
91
	}
92
93
	/**
94
	* Search controller
95
	*
96
	* @param	int	$page	Page number taken from the URL
97
	* @return	\Symfony\Component\HttpFoundation\Response	A Symfony Response object
98
	* @throws	\phpbb\exception\http_exception
99
	*/
100
	public function main($page)
101
	{
102
		if (!$this->auth->acl_get('u_search_dir'))
103
		{
104
			throw new \phpbb\exception\http_exception(403, 'DIR_ERROR_NOT_AUTH');
105
		}
106
107
		$cat_id				= $this->request->variable('cat_id', 0);
108
		$keywords			= $this->request->variable('keywords', '', true);
109
		$search_terms		= $this->request->variable('terms', 'all');
110
		$search_category	= $this->request->variable('cid', array(0));
111
		$search_fields		= $this->request->variable('sf', 'all');
112
		$search_child		= $this->request->variable('sc', true);
113
		$sort_days			= $this->request->variable('st', 0);
114
		$sort_key			= $this->request->variable('sk', 't');
115
		$sort_dir			= $this->request->variable('sd', 'd');
116
		$start				= ($page - 1) * (int) $this->config['dir_show'];
117
118
		$default_sort_days	= 0;
119
		$default_sort_key	= (string) substr($this->config['dir_default_order'], 0, 1);
120
		$default_sort_dir	= (string) substr($this->config['dir_default_order'], 2);
121
122
		// Categorie ordering options
123
		$limit_days		= array(0 => $this->language->lang('ALL_RESULTS'), 1 => $this->language->lang('1_DAY'), 7 => $this->language->lang('7_DAYS'), 14 => $this->language->lang('2_WEEKS'), 30 => $this->language->lang('1_MONTH'), 90 => $this->language->lang('3_MONTHS'), 180 => $this->language->lang('6_MONTHS'), 365 => $this->language->lang('1_YEAR'));
124
		$sort_by_text	= array('a' => $this->language->lang('AUTHOR'), 't' => $this->language->lang('POST_TIME'), 'r' => $this->language->lang('DIR_COMMENTS_ORDER'), 's' =>  $this->language->lang('DIR_NAME_ORDER'), 'v' => $this->language->lang('DIR_NB_CLICKS_ORDER'));
125
		$sort_by_sql	= array('a' => 'u.username_clean', 't' => array('l.link_time', 'l.link_id'), 'r' => 'l.link_comment', 's' => 'LOWER(l.link_name)', 'v' => 'l.link_view');
126
127
		$s_limit_days = $s_sort_key = $s_sort_dir = $u_sort_param = '';
128
		gen_sort_selects($limit_days, $sort_by_text, $sort_days, $sort_key, $sort_dir, $s_limit_days, $s_sort_key, $s_sort_dir, $u_sort_param);
129
130
		$u_sort_param = ($sort_days === $default_sort_days && $sort_key == $default_sort_key && $sort_dir == $default_sort_dir) ? array() : array('sort_days' => $sort_days, 'sort_key' => $sort_key, 'sort_dir' => $sort_dir);
131
132
		/*
133
		** search form submited
134
		*/
135
		if ($this->request->is_set('submit') || $keywords)
136
		{
137
			// clear arrays
138
			$id_ary = $u_search = array();
139
			$keywords_ary = ($keywords) ? explode(' ', $keywords) : array();
140
141
			if (!count($keywords_ary))
142
			{
143
				return $this->helper->message('DIR_ERROR_KEYWORD');
144
			}
145
146
			$ex_cid_ary = $this->_get_exclude_categories($search_category, $search_child);
147
148
			$total_match_count = $this->search->keyword_search($keywords_ary, $search_fields, $search_terms, $sort_by_sql, $sort_key, $sort_dir, $sort_days, $ex_cid_ary, $cat_id, $id_ary, $start, $this->config['dir_show']);
149
150
			$l_search_matches = $this->language->lang('FOUND_SEARCH_MATCHES', (int) $total_match_count);
151
152
			if (count($id_ary))
153
			{
154
				$sql_where = $this->db->sql_in_set('l.link_id', $id_ary);
155
			}
156
			else
157
			{
158
				return $this->helper->message('DIR_SEARCH_NO_RESULT');
159
			}
160
161
			// A single wildcard will make the search results look ugly
162
			$hilit = phpbb_clean_search_string(str_replace(array('+', '-', '|', '(', ')', '&quot;'), ' ', $keywords));
163
			$hilit = str_replace(' ', '|', $hilit);
164
165
			$u_hilit = urlencode(htmlspecialchars_decode(str_replace('|', ' ', $hilit)));
166
167
			($u_hilit) 					? $u_search['keywords']		= urlencode(htmlspecialchars_decode($keywords)) : '';
168
			($search_terms != 'all') 	? $u_search['terms']		= $search_terms : '';
169
			($cat_id)					? $u_search['cat_id']		= $cat_id : '';
170
			($search_category)			? $u_search['cid']			= $search_category : '';
171
			(!$search_child)			? $u_search['sc']			= 0 : '';
172
			($search_fields != 'all')	? $u_search['sf'] 			= $search_fields : '';
173
174
			$base_url = array(
175
				'routes'	=> 'ernadoo_phpbbdirectory_search_controller',
176
				'params'	=> array_merge($u_search, $u_sort_param),
177
			);
178
179
			$u_search = $this->helper->route('ernadoo_phpbbdirectory_search_controller', array_merge($u_search, $u_sort_param));
180
181
			$this->pagination->generate_template_pagination($base_url, 'pagination', 'page', $total_match_count, $this->config['dir_show'], $start);
182
183
			$this->template->assign_vars(array(
184
				'SEARCH_MATCHES'	=> $l_search_matches,
185
				'SEARCH_WORDS'		=> $keywords,
186
187
				'TOTAL_MATCHES'		=> $total_match_count,
188
189
				'S_SELECT_SORT_DIR'		=> $s_sort_dir,
190
				'S_SELECT_SORT_KEY'		=> $s_sort_key,
191
				'S_SELECT_SORT_DAYS'	=> $s_limit_days,
192
				'S_SEARCH_ACTION'		=> $u_search,
193
194
				'U_DIR_SEARCH'			=> $this->helper->route('ernadoo_phpbbdirectory_search_controller'),
195
				'U_SEARCH_WORDS'		=> $u_search,
196
			));
197
198
			if ($cat_id)
199
			{
200
				$this->template->assign_vars(array(
201
					'SEARCH_CATEGORY'	=> $this->language->lang('RETURN_TO', \ernadoo\phpbbdirectory\core\categorie::getname((int) $cat_id)),
202
					'U_SEARCH_CATEGORY'	=> $this->helper->route('ernadoo_phpbbdirectory_dynamic_route_' . $cat_id),
203
				));
204
			}
205
206
			if ($sql_where)
207
			{
208
				$sql_array = array(
209
					'SELECT'	=> 'l.link_name, l.link_description, l.link_url, l.link_uid, l.link_bitfield, l.link_flags, l.link_view, l.link_user_id, l.link_time, l.link_comment, l.link_flag, l.link_id, l.link_thumb, l.link_banner, c.cat_name, u.user_id, u.username, u.user_colour',
210
					'FROM'		=> array(
211
							$this->links_table	=> 'l'),
212
					'LEFT_JOIN'	=> array(
213
							array(
214
								'FROM'	=> array($this->categories_table => 'c'),
215
								'ON'	=> 'l.link_cat = c.cat_id'
216
							),
217
							array(
218
								'FROM'	=> array(USERS_TABLE => 'u'),
219
								'ON'	=> 'u.user_id = l.link_user_id'
220
							)
221
					),
222
					'WHERE'		=> $sql_where);
223
224
				$sql = $this->db->sql_build_query('SELECT', $sql_array);
225
				$result = $this->db->sql_query($sql);
226
227
				$rowset = $this->db->sql_fetchrowset($result);
228
229
				if (count($rowset))
230
				{
231
					if ($hilit)
232
					{
233
						// Remove bad highlights
234
						$hilit_array = array_filter(explode('|', $hilit), 'strlen');
235
						foreach ($hilit_array as $key => $value)
236
						{
237
							$hilit_array[$key] = phpbb_clean_search_string($value);
238
							$hilit_array[$key] = str_replace('\*', '\w*?', preg_quote($hilit_array[$key], '#'));
239
							$hilit_array[$key] = preg_replace('#(^|\s)\\\\w\*\?(\s|$)#', '$1\w+?$2', $hilit_array[$key]);
240
						}
241
						$hilit = implode('|', $hilit_array);
242
					}
243
244
					foreach ($rowset as $data)
245
					{
246
						$s_banner	= $this->link->display_bann($data);
247
						$s_thumb	= $this->link->display_thumb($data);
248
						$s_flag		= $this->link->display_flag($data);
249
250
						$data['link_description'] = generate_text_for_display($data['link_description'], $data['link_uid'], $data['link_bitfield'], $data['link_flags']);
251
252
						if ($hilit)
253
						{
254
							$data['link_name'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#isu', '<span class="posthilit">$1</span>', $data['link_name']);
255
							$data['link_description'] = preg_replace('#(?!<.*)(?<!\w)(' . $hilit . ')(?!\w|[^<>]*(?:</s(?:cript|tyle))?>)#isu', '<span class="posthilit">$1</span>', $data['link_description']);
256
						}
257
258
						$this->template->assign_block_vars('results', array(
259
							'S_SITE'		=> $data['link_name'],
260
							'S_DESCRIPTION' => $data['link_description'],
261
							'S_COUNT'		=> $data['link_view'],
262
							'S_CAT'			=> $data['cat_name'],
263
							'S_USER'		=> get_username_string('full', $data['link_user_id'], $data['username'], $data['user_colour']),
264
							'S_TIME'		=> ($data['link_time'] != 0) ? $this->user->format_date($data['link_time']) : '',
265
							'S_COMMENT'		=> $data['link_comment'],
266
267
							'THUMB'			=> '<img src="'.$s_thumb.'" alt="'.$this->language->lang('DIR_THUMB').'" title="'.$data['link_name'].'"/>',
268
							'IMG_BANNER'	=> $s_banner,
269
							'IMG_FLAG'		=> $this->config['dir_activ_flag'] ? $s_flag : '',
270
							'ON_CLICK' 		=> "onclick=\"window.open('".$this->helper->route('ernadoo_phpbbdirectory_view_controller', array('link_id' => (int) $data['link_id']))."'); return false;\"",
271
272
							'L_DIR_SEARCH_NB_CLICKS'	=> $this->language->lang('DIR_SEARCH_NB_CLICKS', (int) $data['link_view']),
273
							'L_DIR_SEARCH_NB_COMMS'		=> $this->language->lang('DIR_SEARCH_NB_COMMS', (int) $data['link_comment']),
274
275
							'U_COMMENT'		=> $this->helper->route('ernadoo_phpbbdirectory_comment_view_controller', array('link_id' => (int) $data['link_id'])),
276
							'U_SITE'		=> $data['link_url'],
277
							'LINK_ID'		=> $data['link_id'],
278
						));
279
					}
280
					unset($rowset);
281
282
					return $this->helper->render('search_results.html', $this->language->lang('DIR_MAKE_SEARCH'));
283
				}
284
			}
285
		}
286
287
		$s_catlist = $this->categorie->make_cat_select();
288
289
		if (!$s_catlist)
290
		{
291
			return $this->helper->message('NO_SEARCH');
292
		}
293
294
		$this->template->assign_vars(array(
295
			'S_POST_ACTION'			=> build_url(true),
296
			'S_KEYWORD'				=> $keywords,
297
			'S_CATLIST'				=> $s_catlist,
298
			'S_SELECT_SORT_DIR'		=> $s_sort_dir,
299
			'S_SELECT_SORT_KEY'		=> $s_sort_key,
300
			'S_SELECT_SORT_DAYS'	=> $s_limit_days,
301
		));
302
303
		return $this->helper->render('search_body.html', $this->language->lang('DIR_MAKE_SEARCH'));
304
	}
305
306
	/**
307
	*
308
	* @param	array	$search_category
309
	* @param	bool	$search_child
310
	* @return	array	Categories to exclude from search
311
	*/
312
	private function _get_exclude_categories(&$search_category, $search_child)
313
	{
314
		$sql = 'SELECT cat_id, parent_id, right_id
315
				FROM ' . $this->categories_table . '
316
				ORDER BY left_id';
317
		$result = $this->db->sql_query($sql);
318
319
		$right_id = 0;
320
		$reset_search_category = true;
321
		$ex_cid_ary = array();
322
323
		while ($row = $this->db->sql_fetchrow($result))
324
		{
325
			if (count($search_category))
326
			{
327
				if ($search_child)
328
				{
329
					if (in_array($row['cat_id'], $search_category) && $row['right_id'] > $right_id)
330
					{
331
						$right_id = (int) $row['right_id'];
332
					}
333
					else if ($row['right_id'] < $right_id)
334
					{
335
						continue;
336
					}
337
				}
338
339
				if (!in_array($row['cat_id'], $search_category))
340
				{
341
					$ex_cid_ary[] = (int) $row['cat_id'];
342
					$reset_search_category = false;
343
				}
344
			}
345
		}
346
		$this->db->sql_freeresult($result);
347
348
		if ($reset_search_category)
349
		{
350
			$search_category = array();
351
		}
352
353
		return $ex_cid_ary;
354
	}
355
}
356