Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 224
0.00% covered (danger)
0.00%
0 / 1
CRAP
0.00% covered (danger)
0.00%
0 / 1
acp_reasons
0.00% covered (danger)
0.00%
0 / 222
0.00% covered (danger)
0.00%
0 / 1
3306
0.00% covered (danger)
0.00%
0 / 1
 main
0.00% covered (danger)
0.00%
0 / 222
0.00% covered (danger)
0.00%
0 / 1
3306
1<?php
2/**
3*
4* This file is part of the phpBB Forum Software package.
5*
6* @copyright (c) phpBB Limited <https://www.phpbb.com>
7* @license GNU General Public License, version 2 (GPL-2.0)
8*
9* For full copyright and license information, please see
10* the docs/CREDITS.txt file.
11*
12*/
13
14/**
15* @ignore
16*/
17if (!defined('IN_PHPBB'))
18{
19    exit;
20}
21
22class acp_reasons
23{
24    var $u_action;
25
26    function main($id, $mode)
27    {
28        global $db, $user, $template;
29        global $request, $phpbb_log;
30
31        $user->add_lang(array('mcp', 'acp/posting'));
32
33        // Set up general vars
34        $action = $request->variable('action', '');
35        $submit = (isset($_POST['submit'])) ? true : false;
36        $reason_id = $request->variable('id', 0);
37
38        $this->tpl_name = 'acp_reasons';
39        $this->page_title = 'ACP_REASONS';
40
41        $form_name = 'acp_reason';
42        add_form_key('acp_reason');
43
44        $error = array();
45
46        switch ($action)
47        {
48            case 'add':
49            case 'edit':
50
51                $reason_row = array(
52                    'reason_title'            => $request->variable('reason_title', '', true),
53                    'reason_description'    => $request->variable('reason_description', '', true),
54                );
55
56                if ($submit)
57                {
58                    if (!check_form_key($form_name))
59                    {
60                        $error[] = $user->lang['FORM_INVALID'];
61                    }
62                    // Reason specified?
63                    if (!$reason_row['reason_title'] || !$reason_row['reason_description'])
64                    {
65                        $error[] = $user->lang['NO_REASON_INFO'];
66                    }
67
68                    $check_double = ($action == 'add') ? true : false;
69
70                    if ($action == 'edit')
71                    {
72                        $sql = 'SELECT reason_title
73                            FROM ' . REPORTS_REASONS_TABLE . "
74                            WHERE reason_id = $reason_id";
75                        $result = $db->sql_query($sql);
76                        $row = $db->sql_fetchrow($result);
77                        $db->sql_freeresult($result);
78
79                        if (strtolower($row['reason_title']) == 'other' || strtolower($reason_row['reason_title']) == 'other')
80                        {
81                            $reason_row['reason_title'] = 'other';
82                        }
83
84                        if ($row['reason_title'] != $reason_row['reason_title'])
85                        {
86                            $check_double = true;
87                        }
88                    }
89
90                    // Check for same reason if adding it...
91                    if ($check_double)
92                    {
93                        $sql = 'SELECT reason_id
94                            FROM ' . REPORTS_REASONS_TABLE . "
95                            WHERE reason_title = '" . $db->sql_escape($reason_row['reason_title']) . "'";
96                        $result = $db->sql_query($sql);
97                        $row = $db->sql_fetchrow($result);
98                        $db->sql_freeresult($result);
99
100                        if ($row || ($action == 'add' && strtolower($reason_row['reason_title']) == 'other'))
101                        {
102                            $error[] = $user->lang['REASON_ALREADY_EXIST'];
103                        }
104                    }
105
106                    if (!count($error))
107                    {
108                        // New reason?
109                        if ($action == 'add')
110                        {
111                            // Get new order...
112                            $sql = 'SELECT MAX(reason_order) as max_reason_order
113                                FROM ' . REPORTS_REASONS_TABLE;
114                            $result = $db->sql_query($sql);
115                            $max_order = (int) $db->sql_fetchfield('max_reason_order');
116                            $db->sql_freeresult($result);
117
118                            $sql_ary = array(
119                                'reason_title'            => (string) $reason_row['reason_title'],
120                                'reason_description'    => (string) $reason_row['reason_description'],
121                                'reason_order'            => $max_order + 1
122                            );
123
124                            $db->sql_query('INSERT INTO ' . REPORTS_REASONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
125
126                            $log = 'ADDED';
127                        }
128                        else if ($reason_id)
129                        {
130                            $sql_ary = array(
131                                'reason_title'            => (string) $reason_row['reason_title'],
132                                'reason_description'    => (string) $reason_row['reason_description'],
133                            );
134
135                            $db->sql_query('UPDATE ' . REPORTS_REASONS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . '
136                                WHERE reason_id = ' . $reason_id);
137
138                            $log = 'UPDATED';
139                        }
140
141                        $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_REASON_' . $log, false, array($reason_row['reason_title']));
142                        trigger_error($user->lang['REASON_' . $log] . adm_back_link($this->u_action));
143                    }
144                }
145                else if ($reason_id)
146                {
147                    $sql = 'SELECT *
148                        FROM ' . REPORTS_REASONS_TABLE . '
149                        WHERE reason_id = ' . $reason_id;
150                    $result = $db->sql_query($sql);
151                    $reason_row = $db->sql_fetchrow($result);
152                    $db->sql_freeresult($result);
153
154                    if (!$reason_row)
155                    {
156                        trigger_error($user->lang['NO_REASON'] . adm_back_link($this->u_action), E_USER_WARNING);
157                    }
158                }
159
160                $l_title = ($action == 'edit') ? 'EDIT' : 'ADD';
161
162                $translated = false;
163
164                // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
165                if (isset($user->lang['report_reasons']['TITLE'][strtoupper($reason_row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($reason_row['reason_title'])]))
166                {
167                    $translated = true;
168                }
169
170                $template->assign_vars(array(
171                    'L_TITLE'        => $user->lang['REASON_' . $l_title],
172                    'U_ACTION'        => $this->u_action . "&amp;id=$reason_id&amp;action=$action",
173                    'U_BACK'        => $this->u_action,
174                    'ERROR_MSG'        => (count($error)) ? implode('<br />', $error) : '',
175
176                    'REASON_TITLE'            => $reason_row['reason_title'],
177                    'REASON_DESCRIPTION'    => $reason_row['reason_description'],
178
179                    'TRANSLATED_TITLE'        => ($translated) ? $user->lang['report_reasons']['TITLE'][strtoupper($reason_row['reason_title'])] : '',
180                    'TRANSLATED_DESCRIPTION'=> ($translated) ? $user->lang['report_reasons']['DESCRIPTION'][strtoupper($reason_row['reason_title'])] : '',
181
182                    'S_AVAILABLE_TITLES'    => implode($user->lang['COMMA_SEPARATOR'], array_map('htmlspecialchars', array_keys($user->lang['report_reasons']['TITLE']))),
183                    'S_EDIT_REASON'            => true,
184                    'S_TRANSLATED'            => $translated,
185                    'S_ERROR'                => (count($error)) ? true : false,
186                    )
187                );
188
189                return;
190            break;
191
192            case 'delete':
193
194                $sql = 'SELECT *
195                    FROM ' . REPORTS_REASONS_TABLE . '
196                    WHERE reason_id = ' . $reason_id;
197                $result = $db->sql_query($sql);
198                $reason_row = $db->sql_fetchrow($result);
199                $db->sql_freeresult($result);
200
201                if (!$reason_row)
202                {
203                    trigger_error($user->lang['NO_REASON'] . adm_back_link($this->u_action), E_USER_WARNING);
204                }
205
206                if (strtolower($reason_row['reason_title']) == 'other')
207                {
208                    trigger_error($user->lang['NO_REMOVE_DEFAULT_REASON'] . adm_back_link($this->u_action), E_USER_WARNING);
209                }
210
211                // Let the deletion be confirmed...
212                if (confirm_box(true))
213                {
214                    $sql = 'SELECT reason_id
215                        FROM ' . REPORTS_REASONS_TABLE . "
216                        WHERE LOWER(reason_title) = 'other'";
217                    $result = $db->sql_query($sql);
218                    $other_reason_id = (int) $db->sql_fetchfield('reason_id');
219                    $db->sql_freeresult($result);
220
221                    switch ($db->get_sql_layer())
222                    {
223                        // The ugly one!
224                        case 'mysqli':
225                            // Change the reports using this reason to 'other'
226                            $sql = 'UPDATE ' . REPORTS_TABLE . '
227                                SET reason_id = ' . $other_reason_id . ", report_text = CONCAT('" . $db->sql_escape($reason_row['reason_description']) . "\n\n', report_text)
228                                WHERE reason_id = $reason_id";
229                        break;
230
231                        // Standard? What's that?
232                        case 'mssql_odbc':
233                        case 'mssqlnative':
234                            // Change the reports using this reason to 'other'
235                            $sql = "DECLARE @ptrval binary(16)
236
237                                    SELECT @ptrval = TEXTPTR(report_text)
238                                        FROM " . REPORTS_TABLE . "
239                                    WHERE reason_id = " . $reason_id . "
240
241                                    UPDATETEXT " . REPORTS_TABLE . ".report_text @ptrval 0 0 '" . $db->sql_escape($reason_row['reason_description']) . "\n\n'
242
243                                    UPDATE " . REPORTS_TABLE . '
244                                        SET reason_id = ' . $other_reason_id . "
245                                    WHERE reason_id = $reason_id";
246                        break;
247
248                        // Teh standard
249                        case 'postgres':
250                        case 'oracle':
251                        case 'sqlite3':
252                            // Change the reports using this reason to 'other'
253                            $sql = 'UPDATE ' . REPORTS_TABLE . '
254                                SET reason_id = ' . $other_reason_id . ", report_text = '" . $db->sql_escape($reason_row['reason_description']) . "\n\n' || report_text
255                                WHERE reason_id = $reason_id";
256                        break;
257                    }
258                    $db->sql_query($sql);
259
260                    $db->sql_query('DELETE FROM ' . REPORTS_REASONS_TABLE . ' WHERE reason_id = ' . $reason_id);
261
262                    $phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_REASON_REMOVED', false, array($reason_row['reason_title']));
263                    trigger_error($user->lang['REASON_REMOVED'] . adm_back_link($this->u_action));
264                }
265                else
266                {
267                    confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
268                        'i'            => $id,
269                        'mode'        => $mode,
270                        'action'    => $action,
271                        'id'        => $reason_id))
272                    );
273                }
274
275            break;
276
277            case 'move_up':
278            case 'move_down':
279
280                if (!check_link_hash($request->variable('hash', ''), 'acp_reasons'))
281                {
282                    trigger_error($user->lang['FORM_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
283                }
284
285                $sql = 'SELECT reason_order
286                    FROM ' . REPORTS_REASONS_TABLE . "
287                    WHERE reason_id = $reason_id";
288                $result = $db->sql_query($sql);
289                $order = $db->sql_fetchfield('reason_order');
290                $db->sql_freeresult($result);
291
292                if ($order === false || ($order == 0 && $action == 'move_up'))
293                {
294                    break;
295                }
296                $order = (int) $order;
297                $order_total = $order * 2 + (($action == 'move_up') ? -1 : 1);
298
299                $sql = 'UPDATE ' . REPORTS_REASONS_TABLE . '
300                    SET reason_order = ' . $order_total . ' - reason_order
301                    WHERE reason_order IN (' . $order . ', ' . (($action == 'move_up') ? $order - 1 : $order + 1) . ')';
302                $db->sql_query($sql);
303
304                if ($request->is_ajax())
305                {
306                    $json_response = new \phpbb\json_response;
307                    $json_response->send(array(
308                        'success'    => (bool) $db->sql_affectedrows(),
309                    ));
310                }
311            break;
312        }
313
314        // By default, check that order is valid and fix it if necessary
315        $sql = 'SELECT reason_id, reason_order
316            FROM ' . REPORTS_REASONS_TABLE . '
317            ORDER BY reason_order';
318        $result = $db->sql_query($sql);
319
320        if ($row = $db->sql_fetchrow($result))
321        {
322            $order = 0;
323            do
324            {
325                ++$order;
326
327                if ($row['reason_order'] != $order)
328                {
329                    $sql = 'UPDATE ' . REPORTS_REASONS_TABLE . "
330                        SET reason_order = $order
331                        WHERE reason_id = {$row['reason_id']}";
332                    $db->sql_query($sql);
333                }
334            }
335            while ($row = $db->sql_fetchrow($result));
336        }
337        $db->sql_freeresult($result);
338
339        $template->assign_vars(array(
340            'U_ACTION'            => $this->u_action,
341            )
342        );
343
344        // Reason count
345        $sql = 'SELECT reason_id, COUNT(reason_id) AS reason_count
346            FROM ' . REPORTS_TABLE . '
347            GROUP BY reason_id';
348        $result = $db->sql_query($sql);
349
350        $reason_count = array();
351        while ($row = $db->sql_fetchrow($result))
352        {
353            $reason_count[$row['reason_id']] = $row['reason_count'];
354        }
355        $db->sql_freeresult($result);
356
357        $sql = 'SELECT *
358            FROM ' . REPORTS_REASONS_TABLE . '
359            ORDER BY reason_order ASC';
360        $result = $db->sql_query($sql);
361
362        while ($row = $db->sql_fetchrow($result))
363        {
364            $translated = false;
365            $other_reason = ($row['reason_title'] == 'other') ? true : false;
366
367            // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
368            if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
369            {
370                $row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
371                $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
372
373                $translated = true;
374            }
375
376            $template->assign_block_vars('reasons', array(
377                'REASON_TITLE'            => $row['reason_title'],
378                'REASON_DESCRIPTION'    => $row['reason_description'],
379                'REASON_COUNT'            => (isset($reason_count[$row['reason_id']])) ? $reason_count[$row['reason_id']] : 0,
380
381                'S_TRANSLATED'        => $translated,
382                'S_OTHER_REASON'    => $other_reason,
383
384                'U_EDIT'        => $this->u_action . '&amp;action=edit&amp;id=' . $row['reason_id'],
385                'U_DELETE'        => (!$other_reason) ? $this->u_action . '&amp;action=delete&amp;id=' . $row['reason_id'] : '',
386                'U_MOVE_UP'        => $this->u_action . '&amp;action=move_up&amp;id=' . $row['reason_id'] . '&amp;hash=' . generate_link_hash('acp_reasons'),
387                'U_MOVE_DOWN'    => $this->u_action . '&amp;action=move_down&amp;id=' . $row['reason_id'] . '&amp;hash=' . generate_link_hash('acp_reasons'))
388            );
389        }
390        $db->sql_freeresult($result);
391    }
392}