search::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 22

Duplication

Lines 22
Ratio 100 %

Importance

Changes 0
Metric Value
dl 22
loc 22
rs 9.568
c 0
b 0
f 0
cc 1
nc 1
nop 12

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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