Completed
Push — 1.3.0 ( 22fe89...8dc48d )
by Sylver
08:31
created

admin_controller::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 13
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 11
c 1
b 0
f 0
nc 1
nop 11
dl 0
loc 13
rs 9.9

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
* @package		Breizh Smilies Categories Extension
5
* @copyright	(c) 2020 Sylver35  https://breizhcode.com
6
* @license		http://opensource.org/licenses/gpl-license.php GNU Public License
7
*
8
*/
9
10
namespace sylver35\smiliescat\controller;
11
12
use sylver35\smiliescat\core\category;
13
use phpbb\config\config;
14
use phpbb\db\driver\driver_interface as db;
15
use phpbb\pagination;
16
use phpbb\request\request;
17
use phpbb\template\template;
18
use phpbb\user;
19
use phpbb\language\language;
20
use phpbb\log\log;
21
22
class admin_controller
23
{
24
	/* @var \sylver35\smiliescat\core\category */
25
	protected $category;
26
27
	/** @var \phpbb\config\config */
28
	protected $config;
29
30
	/** @var \phpbb\db\driver\driver_interface */
31
	protected $db;
32
33
	/** @var \phpbb\pagination */
34
	protected $pagination;
35
36
	/** @var \phpbb\request\request */
37
	protected $request;
38
39
	/** @var \phpbb\template\template */
40
	protected $template;
41
42
	/** @var \phpbb\user */
43
	protected $user;
44
45
	/** @var \phpbb\language\language */
46
	protected $language;
47
48
	/** @var \phpbb\log\log */
49
	protected $log;
50
51
	/** @var string phpBB root path */
52
	protected $root_path;
53
54
	/** @var string Custom form action */
55
	protected $u_action;
56
57
	/**
58
	 * The database tables
59
	 *
60
	 * @var string */
61
	protected $smilies_category_table;
62
63
	/**
64
	 * Constructor
65
	 */
66
	public function __construct(category $category, config $config, db $db, pagination $pagination, request $request, template $template, user $user, language $language, log $log, $root_path, $smilies_category_table)
67
	{
68
		$this->category = $category;
69
		$this->config = $config;
70
		$this->db = $db;
71
		$this->pagination = $pagination;
72
		$this->request = $request;
73
		$this->template = $template;
74
		$this->user = $user;
75
		$this->language = $language;
76
		$this->log = $log;
77
		$this->root_path = $root_path;
78
		$this->smilies_category_table = $smilies_category_table;
79
	}
80
81
	public function acp_smilies_category()
82
	{
83
		$this->language->add_lang('acp/posting');
84
		$action = (string) $this->request->variable('action', '');
85
		$start = (int) $this->request->variable('start', 0);
86
		$select = (int) $this->request->variable('select', -1);
87
		$id = (int) $this->request->variable('id', -1);
88
		$form_key = 'sylver35/smiliescat';
89
		add_form_key($form_key);
90
91
		if ($action)
92
		{
93
			switch ($action)
94
			{
95
				case 'edit':
96
					$this->category->adm_edit_smiley($id, $this->u_action, $start);
97
				break;
98
99
				case 'modify':
100
					if (!check_form_key($form_key))
101
					{
102
						trigger_error($this->language->lang('FORM_INVALID') . adm_back_link($this->u_action), E_USER_WARNING);
103
					}
104
105
					$this->modify_smiley($id, (int) $this->request->variable('cat_id', 0), (int) $this->request->variable('ex_cat', 0), $start);
106
				break;
107
			}
108
109
			$this->template->assign_vars(array(
110
				'IN_ACTION'			=> true,
111
			));
112
		}
113
		else
114
		{
115
			$this->extract_list_smilies($select, $start);
116
117
			$this->template->assign_vars(array(
118
				'LIST_CATEGORY'		=> $this->category->select_categories($select, true),
119
				'U_SELECT_CAT'		=> $this->u_action . '&amp;select=' . $select,
120
				'U_BACK'			=> ($select) ? $this->u_action : '',
121
			));
122
		}
123
124
		$this->template->assign_vars(array(
125
			'CATEGORIE_SMILIES'		=> true,
126
		));
127
	}
128
129
	public function acp_categories_config()
130
	{
131
		$this->language->add_lang('acp/language');
132
		$mode = (string) $this->request->variable('mode', '');
133
		$action = (string) $this->request->variable('action', '');
134
		$id = (int) $this->request->variable('id', 0);
135
		$form_key = 'sylver35/smiliescat';
136
		add_form_key($form_key);
137
138
		if ($action)
139
		{
140
			if (in_array($action, array('config_cat', 'add_cat', 'edit_cat')) && !check_form_key($form_key))
141
			{
142
				trigger_error($this->language->lang('FORM_INVALID') . adm_back_link($this->u_action), E_USER_WARNING);
143
			}
144
145
			switch ($action)
146
			{
147
				case 'config_cat':
148
					$this->config->set('smilies_per_page_cat', (int) $this->request->variable('smilies_per_page_cat', 15));
149
150
					$this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_SC_CONFIG', time());
151
					trigger_error($this->language->lang('CONFIG_UPDATED') . adm_back_link($this->u_action));
152
				break;
153
154
				case 'add':
155
					$this->category->adm_add_cat($this->u_action);
156
				break;
157
158
				case 'add_cat':
159
					$this->add_category();
160
				break;
161
162
				case 'edit':
163
					$this->category->adm_edit_cat($id, $this->u_action);
164
				break;
165
166
				case 'edit_cat':
167
					$this->edit_category($id);
168
				break;
169
170
				case 'delete':
171
					if (confirm_box(true))
172
					{
173
						$this->delete_cat($id);
174
					}
175
					else
176
					{
177
						confirm_box(false, $this->language->lang('CONFIRM_OPERATION'), build_hidden_fields(array(
178
							'mode'		=> $mode,
179
							'id'		=> $id,
180
							'action'	=> $action,
181
						)));
182
					}
183
				break;
184
				
185
			}
186
187
			$this->template->assign_vars(array(
188
				'IN_ACTION'		=> true,
189
			));
190
		}
191
		else
192
		{
193
			$this->category->adm_list_cat($this->u_action);
194
		}
195
196
		$this->template->assign_vars(array(
197
			'CATEGORIE_CONFIG'		=> true,
198
			'SMILIES_PER_PAGE_CAT'	=> $this->config['smilies_per_page_cat'],
199
			'U_ACTION_CONFIG'		=> $this->u_action . '&amp;action=config_cat',
200
			'U_ADD'					=> $this->u_action . '&amp;action=add',
201
		));
202
	}
203
204
	private function modify_smiley($id, $cat_id, $ex_cat, $start)
205
	{
206
		$sql = 'UPDATE ' . SMILIES_TABLE . " SET category = $cat_id WHERE smiley_id = $id";
207
		$this->db->sql_query($sql);
208
209
		// Decrement nb value if wanted
210
		if ($ex_cat !== 0)
211
		{
212
			$sql = 'UPDATE ' . $this->smilies_category_table . ' SET cat_nb = cat_nb - 1 WHERE cat_id = ' . $ex_cat;
213
			$this->db->sql_query($sql);
214
		}
215
		// Increment nb value if wanted
216
		if ($cat_id !== 0)
217
		{
218
			$sql = 'UPDATE ' . $this->smilies_category_table . ' SET cat_nb = cat_nb + 1 WHERE cat_id = ' . $cat_id;
219
			$this->db->sql_query($sql);
220
		}
221
222
		trigger_error($this->language->lang('SMILIES_EDITED', 1) . adm_back_link($this->u_action . '&amp;start=' . $start . '#acp_smilies_category'));
223
	}
224
225
	private function extract_list_smilies($select, $start)
226
	{
227
		$i = 0;
228
		$cat = -1;
229
		$lang = $this->user->lang_name;
230
		$smilies_count = (int) $this->category->smilies_count($select);
231
232
		if ($select === 0)
233
		{
234
			$sql = $this->db->sql_build_query('SELECT', array(
235
				'SELECT'	=> '*',
236
				'FROM'		=> array(SMILIES_TABLE => ''),
237
				'WHERE'		=> 'category = 0',
238
				'ORDER_BY'	=> 'smiley_order ASC',
239
			));
240
		}
241
		else
242
		{
243
			$sql = $this->db->sql_build_query('SELECT', array(
244
				'SELECT'	=> 's.*, c.*',
245
				'FROM'		=> array(SMILIES_TABLE => 's'),
246
				'LEFT_JOIN'	=> array(
247
					array(
248
						'FROM'	=> array($this->smilies_category_table => 'c'),
249
						'ON'	=> "cat_id = category AND cat_lang = '$lang'",
250
					),
251
				),
252
				'WHERE'		=> ($select == -1) ? "code <> ''" : "cat_id = $select AND code <> ''",
253
				'ORDER_BY'	=> 'cat_order ASC, smiley_order ASC',
254
			));
255
		}
256
		$result = $this->db->sql_query_limit($sql, (int) $this->config['smilies_per_page_cat'], $start);
257
		while ($row = $this->db->sql_fetchrow($result))
258
		{
259
			$row['category'] = isset($row['category']) ? $row['category'] : 0;
260
			$row['cat_name'] = ($row['category']) ? $row['cat_name'] : $this->language->lang('SC_CATEGORY_DEFAUT');
261
262
			$this->template->assign_block_vars('items', array(
263
				'SPACER_CAT'	=> ($cat !== (int) $row['category']) ? $this->language->lang('SC_CATEGORY_IN', $row['cat_name']) : '',
264
				'IMG_SRC'		=> $row['smiley_url'],
265
				'WIDTH'			=> $row['smiley_width'],
266
				'HEIGHT'		=> $row['smiley_height'],
267
				'CODE'			=> $row['code'],
268
				'EMOTION'		=> $row['emotion'],
269
				'CATEGORY'		=> $row['cat_name'],
270
				'U_EDIT'		=> $this->u_action . '&amp;action=edit&amp;id=' . $row['smiley_id'] . '&amp;start=' . $start,
271
			));
272
			$i++;
273
274
			// Keep this value in memory
275
			$cat = (int) $row['category'];
276
		}
277
		$this->db->sql_freeresult($result);
278
279
		$this->template->assign_vars(array(
280
			'NB_SMILIES'	=> $smilies_count,
281
			'U_SMILIES'		=> $this->root_path . $this->config['smilies_path'] . '/',
282
		));
283
284
		$this->pagination->generate_template_pagination($this->u_action . '&amp;select=' . $select, 'pagination', 'start', $smilies_count, (int) $this->config['smilies_per_page_cat'], $start);
285
	}
286
287
	private function delete_cat($id)
288
	{
289
		$id = (int) $id;
290
		$sql = 'SELECT cat_title, cat_order
291
			FROM ' . $this->smilies_category_table . '
292
				WHERE cat_id = ' . $id;
293
		$result = $this->db->sql_query($sql);
294
		$row = $this->db->sql_fetchrow($result);
295
		$title = $row['cat_title'];
296
		$order = $row['cat_order'];
297
		$this->db->sql_freeresult($result);
298
299
		$sql_delete = 'DELETE FROM ' . $this->smilies_category_table . ' WHERE cat_id = ' . $id;
300
		$this->db->sql_query($sql_delete);
301
302
		// Decrement orders if needed
303
		$sql_decrement = 'SELECT cat_id, cat_order
304
			FROM ' . $this->smilies_category_table . '
305
				WHERE cat_order > ' . (int) $order;
306
		$result = $this->db->sql_query($sql_decrement);
307
		while ($row = $this->db->sql_fetchrow($result))
308
		{
309
			$new_order = (int) $row['cat_order'] - 1;
310
			$sql_order = 'UPDATE ' . $this->smilies_category_table . '
311
				SET cat_order = ' . $new_order . '
312
					WHERE cat_id = ' . $row['cat_id'] . ' AND cat_order = ' . $row['cat_order'];
313
			$this->db->sql_query($sql_order);
314
		}
315
		$this->db->sql_freeresult($result);
316
317
		// Reset appropriate smilies category id
318
		$sql_update = 'UPDATE ' . SMILIES_TABLE . ' SET category = 0 WHERE category = ' . $id;
319
		$this->db->sql_query($sql_update);
320
321
		$this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_SC_DELETE_CAT', time(), array($title));
322
		trigger_error($this->language->lang('SC_DELETE_SUCCESS') . adm_back_link($this->u_action));
323
	}
324
325
	private function add_category()
326
	{
327
		$title = $this->request->variable('name_' . $this->user->lang_name, '', true);
328
		$cat_order = (int) $this->request->variable('order', 0);
329
		$cat_id = (int) $this->category->get_max_id() + 1;
330
		$sql_in = array();
331
		$i = 0;
332
333
		$sql = 'SELECT lang_id, lang_iso
334
			FROM ' . LANG_TABLE . "
335
				ORDER BY lang_id ASC";
336
		$result = $this->db->sql_query($sql);
337
		while ($row = $this->db->sql_fetchrow($result))
338
		{
339
			$iso = $row['lang_iso'];
340
			$lang = (string) $this->request->variable("lang_$iso", '', true);
341
			$name = (string) $this->request->variable("name_$iso", '', true);
342
			if ($name === '')
343
			{
344
				trigger_error($this->language->lang('SC_CATEGORY_ERROR') . adm_back_link($this->u_action . '&amp;action=add'), E_USER_WARNING);
345
			}
346
			else
347
			{
348
				$sql_in[$i] = array(
349
					'cat_id'		=> $cat_id,
350
					'cat_order'		=> $cat_order,
351
					'cat_lang'		=> $lang,
352
					'cat_name'		=> $this->category->capitalize($name),
353
					'cat_title'		=> $this->category->capitalize($title),
354
				);
355
			}
356
			$i++;
357
		}
358
359
		for ($j = 0; $j < $i; $j++)
360
		{
361
			$this->db->sql_query('INSERT INTO ' . $this->smilies_category_table . $this->db->sql_build_array('INSERT', $sql_in[$j]));
362
		}
363
364
		if ($cat_order === 1)
365
		{
366
			$this->config->set('smilies_category_nb', $cat_id);
367
		}
368
369
		$this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_SC_ADD_CAT', time(), array($title));
370
		trigger_error($this->language->lang('SC_CREATE_SUCCESS') . adm_back_link($this->u_action));
371
	}
372
373
	private function edit_category($id)
374
	{
375
		$id = (int) $id;
376
		$title = $this->category->capitalize($this->request->variable('name_' . $this->user->lang_name, '', true));
377
378
		$sql = 'SELECT lang_id, lang_iso
379
			FROM ' . LANG_TABLE . "
380
				ORDER BY lang_id ASC";
381
		$result = $this->db->sql_query($sql);
382
		while ($row = $this->db->sql_fetchrow($result))
383
		{
384
			$iso = $row['lang_iso'];
385
			$lang = (string) $this->request->variable("lang_$iso", '', true);
386
			$sort = (string) $this->request->variable("sort_$iso", '');
387
			$order = (int) $this->request->variable('order', 0);
388
			$name = $this->category->capitalize($this->request->variable("name_$iso", '', true));
389
			if ($name === '')
390
			{
391
				trigger_error($this->language->lang('SC_CATEGORY_ERROR') . adm_back_link($this->u_action . '&amp;action=edit&amp;id=' . $id), E_USER_WARNING);
392
			}
393
			else
394
			{
395
				if ($sort === 'edit')
396
				{
397
					$sql = 'UPDATE ' . $this->smilies_category_table . "
398
						SET cat_name = '" . $name . "', cat_title = '" . $title . "'
399
							WHERE cat_lang = '" . $this->db->sql_escape($lang) . "'
400
							AND cat_id = $id";
401
					$this->db->sql_query($sql);
402
				}
403
				else if ($sort === 'create')
404
				{
405
					$sql_in = array(
406
						'cat_id'		=> $id,
407
						'cat_order'		=> $order,
408
						'cat_lang'		=> $lang,
409
						'cat_name'		=> $name,
410
						'cat_title'		=> $title,
411
					);
412
					$this->db->sql_query('INSERT INTO ' . $this->smilies_category_table . $this->db->sql_build_array('INSERT', $sql_in));
413
				}
414
			}
415
		}
416
417
		$this->log->add('admin', $this->user->data['user_id'], $this->user->ip, 'LOG_SC_EDIT_CAT', time(), array($title));
418
		trigger_error($this->language->lang('SC_EDIT_SUCCESS') . adm_back_link($this->u_action));
419
	}
420
421
	/**
422
	 * Set page url
423
	 *
424
	 * @param string $u_action Custom form action
425
	 * @return null
426
	 * @access public
427
	 */
428
	public function set_page_url($u_action)
429
	{
430
		$this->u_action = $u_action;
431
	}
432
}
433