Completed
Pull Request — master (#2)
by Jakub
05:27
created

admin_controller::action_delete()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 15
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 6

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 15
ccs 0
cts 14
cp 0
rs 9.4285
cc 2
eloc 8
nc 2
nop 0
crap 6
1
<?php
2
/**
3
 *
4
 * Advertisement management. An extension for the phpBB Forum Software package.
5
 *
6
 * @copyright (c) 2017 phpBB Limited <https://www.phpbb.com>
7
 * @license GNU General Public License, version 2 (GPL-2.0)
8
 *
9
 */
10
11
namespace phpbb\admanagement\controller;
12
13
/**
14
* Admin controller
15
*/
16
class admin_controller
17
{
18
	/** @var \phpbb\db\driver\driver_interface */
19
	protected $db;
20
21
	/** @var \phpbb\template\template */
22
	protected $template;
23
24
	/** @var \phpbb\user */
25
	protected $user;
26
27
	/** @var \phpbb\request\request */
28
	protected $request;
29
30
	/** @var string ads_table */
31
	protected $ads_table;
32
33
	/** @var string Custom form action */
34
	protected $u_action;
35
36
	/**
37
	* Constructor
38
	*
39
	* @param \phpbb\db\driver\driver_interface	$db			DB driver interface
40
	* @param \phpbb\template\template			$template	Template object
41
	* @param \phpbb\user						$user		User object
42
	* @param \phpbb\request\request				$request	Request object
43
	* @param string								$ads_table	Ads table
44
	*/
45
	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\template\template $template, \phpbb\user $user, \phpbb\request\request $request, $ads_table)
46
	{
47
		$this->db = $db;
48
		$this->template = $template;
49
		$this->user = $user;
50
		$this->request = $request;
51
		$this->ads_table = $ads_table;
52
	}
53
54
	/**
55
	* Set page url
56
	*
57
	* @param string $u_action Custom form action
58
	* @return void
59
	*/
60
	public function set_page_url($u_action)
61
	{
62
		$this->u_action = $u_action;
63
	}
64
65
	/**
66
	* Load module-specific language
67
	*
68
	* @return void
69
	*/
70
	public function load_lang()
71
	{
72
		$this->user->add_lang_ext('phpbb/admanagement', 'acp');
73
	}
74
75
	/**
76
	* Get ACP page title for Ads module
77
	*
78
	* @return string	Language string for Ads ACP module
79
	*/
80
	public function get_page_title()
81
	{
82
		return $this->user->lang('ACP_ADMANAGEMENT_TITLE');
83
	}
84
85
	/**
86
	* Get action
87
	*
88
	* @return string	Ads module action
89
	*/
90
	public function get_action()
91
	{
92
		return $this->request->variable('action', '');
93
	}
94
95
	/**
96
	* Process 'add' action
97
	*
98
	* @return void
99
	*/
100
	public function action_add()
101
	{
102
		$errors = array();
103
104
		add_form_key('phpbb/admanagement/add');
105
		if ($this->request->is_set_post('submit'))
106
		{
107
			if (!check_form_key('phpbb/admanagement/add'))
108
			{
109
				$errors[] = $this->user->lang('FORM_INVALID');
110
			}
111
112
			$data = array(
113
				'ad_name'		=> $this->request->variable('ad_name', '', true),
114
				'ad_note'		=> $this->request->variable('ad_note', '', true),
115
				'ad_code'		=> $this->request->variable('ad_code', '', true),
116
				'ad_enabled'	=> $this->request->variable('ad_enabled', false),
117
			);
118
119
			// Validate data
120
			if ($data['ad_name'] === '')
121
			{
122
				$errors[] = $this->user->lang('AD_NAME_REQUIRED');
123
			}
124 View Code Duplication
			if (truncate_string($data['ad_name'], 255) !== $data['ad_name'])
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
125
			{
126
				$errors[] = $this->user->lang('AD_NAME_TOO_LONG');
127
			}
128
129
			if (empty($errors))
130
			{
131
				// Insert the ad data to the database
132
				$sql = 'INSERT INTO ' . $this->ads_table . ' ' . $this->db->sql_build_array('INSERT', $data);
133
				$this->db->sql_query($sql);
134
135
				trigger_error($this->user->lang('ACP_AD_ADD_SUCCESS') . adm_back_link($this->u_action));
136
			}
137
			else
138
			{
139
				$this->template->assign_vars(array(
140
					'S_ERROR'			=> (bool) count($errors),
141
					'ERROR_MSG'			=> count($errors) ? implode('<br />', $errors) : '',
142
143
					'AD_NAME'		=> $data['ad_name'],
144
					'AD_NOTE'		=> $data['ad_note'],
145
					'AD_CODE'		=> $data['ad_code'],
146
					'AD_ENABLED'	=> $data['ad_enabled'],
147
				));
148
			}
149
		}
150
151
		// Set output vars for display in the template
152
		$this->template->assign_vars(array(
153
			'S_ADD_AD'	=> true,
154
			'U_BACK'	=> $this->u_action,
155
		));
156
	}
157
158
	/**
159
	* Process 'edit' action
160
	*
161
	* @return void
162
	*/
163
	public function action_edit()
164
	{
165
		$ad_id = $this->request->variable('id', 0);
166
		$data = $errors = array();
0 ignored issues
show
Unused Code introduced by
$data is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
167
168
		add_form_key('phpbb/admanagement/edit');
169
		if ($this->request->is_set_post('submit'))
170
		{
171
			if (!check_form_key('phpbb/admanagement/edit'))
172
			{
173
				$errors[] = $this->user->lang('FORM_INVALID');
174
			}
175
176
			$data = array(
177
				'ad_name'		=> $this->request->variable('ad_name', '', true),
178
				'ad_note'		=> $this->request->variable('ad_note', '', true),
179
				'ad_code'		=> $this->request->variable('ad_code', '', true),
180
				'ad_enabled'	=> $this->request->variable('ad_enabled', false),
181
			);
182
183
			// Validate data
184
			if ($data['ad_name'] === '')
185
			{
186
				$errors[] = $this->user->lang('AD_NAME_REQUIRED');
187
			}
188 View Code Duplication
			if (truncate_string($data['ad_name'], 255) !== $data['ad_name'])
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
189
			{
190
				$errors[] = $this->user->lang('AD_NAME_TOO_LONG');
191
			}
192
193
			if (empty($errors))
194
			{
195
				// Insert the ad data to the database
196
				$sql = 'UPDATE ' . $this->ads_table . '
197
					SET ' . $this->db->sql_build_array('UPDATE', $data) . '
198
					WHERE ad_id = ' . (int) $ad_id;
199
				$this->db->sql_query($sql);
200
201
				trigger_error($this->user->lang('ACP_AD_EDIT_SUCCESS') . adm_back_link($this->u_action));
202
			}
203
			else
204
			{
205
				$this->template->assign_vars(array(
206
					'S_ERROR'			=> (bool) count($errors),
207
					'ERROR_MSG'			=> count($errors) ? implode('<br />', $errors) : '',
208
				));
209
			}
210
		}
211
		else
212
		{
213
			$sql = 'SELECT *
214
				FROM ' . $this->ads_table . '
215
				WHERE ad_id = ' . (int) $ad_id;
216
			$result = $this->db->sql_query($sql);
217
			$rowset = $this->db->sql_fetchrowset($result);
218
			$data = $rowset[0];
219
			$this->db->sql_freeresult($result);
220
		}
221
222
		// Set output vars for display in the template
223
		$this->template->assign_vars(array(
224
			'S_EDIT_AD'	=> true,
225
			'EDIT_ID'	=> $ad_id,
226
			'U_BACK'	=> $this->u_action,
227
228
			'AD_NAME'		=> $data['ad_name'],
229
			'AD_NOTE'		=> $data['ad_note'],
230
			'AD_CODE'		=> $data['ad_code'],
231
			'AD_ENABLED'	=> $data['ad_enabled'],
232
		));
233
	}
234
235
	/**
236
	* Enable/disable ad
237
	*
238
	* @return void
239
	*/
240
	public function ad_enable($enable)
241
	{
242
		$sql = 'UPDATE ' . $this->ads_table . '
243
			SET ad_enabled = ' . (int) $enable . '
244
			WHERE ad_id = ' . (int) $this->request->variable('id', 0);
245
		$this->db->sql_query($sql);
246
		$success = (bool) $this->db->sql_affectedrows();
247
248
		// If AJAX was used, show user a result message
249
		if ($this->request->is_ajax())
250
		{
251
			$json_response = new \phpbb\json_response;
252
			$json_response->send(array(
253
				'text'	=> $enable ? $this->user->lang('ENABLED') : $this->user->lang('DISABLED'),
254
				'title'	=> $this->user->lang('AD_ENABLE_TITLE', (int) $enable),
255
			));
256
		}
257
258
		// Otherwise, show traditional infobox
259
		if ($success)
260
		{
261
			trigger_error($this->user->lang($enable ? 'ACP_AD_ENABLE_SUCCESS' : 'ACP_AD_DISABLE_SUCCESS') . adm_back_link($this->u_action));
262
		}
263
		else
264
		{
265
			trigger_error($this->user->lang($enable ? 'ACP_AD_ENABLE_ERRORED' : 'ACP_AD_DISABLE_ERRORED') . adm_back_link($this->u_action), E_USER_WARNING);
266
		}
267
	}
268
269
	/**
270
	* Process 'delete' action
271
	*
272
	* @return void
273
	*/
274
	public function action_delete()
275
	{
276
		$sql = 'DELETE FROM ' . $this->ads_table . '
277
			WHERE ad_id = ' . (int) $this->request->variable('id', 0);
278
		$this->db->sql_query($sql);
279
280
		if ($this->db->sql_affectedrows())
281
		{
282
			trigger_error($this->user->lang('ACP_AD_DELETE_SUCCESS') . adm_back_link($this->u_action));
283
		}
284
		else
285
		{
286
			trigger_error($this->user->lang('ACP_AD_DELETE_ERRORED') . adm_back_link($this->u_action), E_USER_WARNING);
287
		}
288
	}
289
290
291
	/**
292
	* Display the ads
293
	*
294
	* @return void
295
	*/
296
	public function list_ads()
297
	{
298
		$sql = 'SELECT ad_id, ad_name, ad_enabled
299
			FROM ' . $this->ads_table;
300
		$result = $this->db->sql_query($sql);
301
		while ($row = $this->db->sql_fetchrow($result))
302
		{
303
			$ad_enabled = (bool) $row['ad_enabled'];
304
305
			$this->template->assign_block_vars('ads', array( // TODO: convert back to original notation (3.1 does not support this)
306
				'NAME'		=> $row['ad_name'],
307
				'S_ENABLED'	=> $ad_enabled,
308
				'ENABLED'	=> (int) $ad_enabled,
309
				'U_ENABLE'	=> $this->u_action . '&amp;action=' . ($ad_enabled ? 'disable' : 'enable') . '&amp;id=' . $row['ad_id'], // TODO: ACP method
310
				'U_PREVIEW'	=> '', // TODO: frontend logic
311
				'U_EDIT'	=> $this->u_action . '&amp;action=edit&amp;id=' . $row['ad_id'], // TODO: ACP method
312
				'U_DELETE'	=> $this->u_action . '&amp;action=delete&amp;id=' . $row['ad_id'], // TODO: ACP method
313
			));
314
		}
315
		$this->db->sql_freeresult($result);
316
317
		// Set output vars for display in the template
318
		$this->template->assign_vars(array(
319
			'U_ACTION_ADD'	=> $this->u_action . '&amp;action=add',
320
		));
321
	}
322
}
323