phpBB
Statistics
| Revision:

root / branches / phpBB-3_0_0 / phpBB / includes / acp / acp_reasons.php

History | View | Annotate | Download (11.1 kB)

1
<?php
2
/**
3
*
4
* @package acp
5
* @version $Id: acp_reasons.php 10603 2010-05-03 18:00:11Z git-gate $
6
* @copyright (c) 2005 phpBB Group
7
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
8
*
9
*/
10
11
/**
12
* @ignore
13
*/
14
if (!defined('IN_PHPBB'))
15
{
16
        exit;
17
}
18
19
/**
20
* @package acp
21
*/
22
class acp_reasons
23
{
24
        var $u_action;
25
26
        function main($id, $mode)
27
        {
28
                global $db, $user, $auth, $template, $cache;
29
                global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
30
31
                $user->add_lang(array('mcp', 'acp/posting'));
32
33
                // Set up general vars
34
                $action = request_var('action', '');
35
                $submit = (isset($_POST['submit'])) ? true : false;
36
                $reason_id = request_var('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'                        => utf8_normalize_nfc(request_var('reason_title', '', true)),
53
                                        'reason_description'        => utf8_normalize_nfc(request_var('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 (!sizeof($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
                                                add_log('admin', 'LOG_REASON_' . $log, $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'                => (sizeof($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(', ', array_map('htmlspecialchars', array_keys($user->lang['report_reasons']['TITLE']))),
183
                                        'S_EDIT_REASON'                        => true,
184
                                        'S_TRANSLATED'                        => $translated,
185
                                        'S_ERROR'                                => (sizeof($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->sql_layer)
222
                                        {
223
                                                // The ugly one!
224
                                                case 'mysqli':
225
                                                case 'mysql4':
226
                                                case 'mysql':
227
                                                        // Change the reports using this reason to 'other'
228
                                                        $sql = 'UPDATE ' . REPORTS_TABLE . '
229
                                                                SET reason_id = ' . $other_reason_id . ", report_text = CONCAT('" . $db->sql_escape($reason_row['reason_description']) . "\n\n', report_text)
230
                                                                WHERE reason_id = $reason_id";
231
                                                break;
232
233
                                                // Standard? What's that?
234
                                                case 'mssql':
235
                                                case 'mssql_odbc':
236
                                                case 'mssqlnative':
237
                                                        // Change the reports using this reason to 'other'
238
                                                        $sql = "DECLARE @ptrval binary(16)
239
240
                                                                        SELECT @ptrval = TEXTPTR(report_text)
241
                                                                                FROM " . REPORTS_TABLE . "
242
                                                                        WHERE reason_id = " . $reason_id . "
243
244
                                                                        UPDATETEXT " . REPORTS_TABLE . ".report_text @ptrval 0 0 '" . $db->sql_escape($reason_row['reason_description']) . "\n\n'
245
246
                                                                        UPDATE " . REPORTS_TABLE . '
247
                                                                                SET reason_id = ' . $other_reason_id . "
248
                                                                        WHERE reason_id = $reason_id";
249
                                                break;
250
251
                                                // Teh standard
252
                                                case 'postgres':
253
                                                case 'oracle':
254
                                                case 'firebird':
255
                                                case 'sqlite':
256
                                                        // Change the reports using this reason to 'other'
257
                                                        $sql = 'UPDATE ' . REPORTS_TABLE . '
258
                                                                SET reason_id = ' . $other_reason_id . ", report_text = '" . $db->sql_escape($reason_row['reason_description']) . "\n\n' || report_text
259
                                                                WHERE reason_id = $reason_id";
260
                                                break;
261
                                        }
262
                                        $db->sql_query($sql);
263
264
                                        $db->sql_query('DELETE FROM ' . REPORTS_REASONS_TABLE . ' WHERE reason_id = ' . $reason_id);
265
266
                                        add_log('admin', 'LOG_REASON_REMOVED', $reason_row['reason_title']);
267
                                        trigger_error($user->lang['REASON_REMOVED'] . adm_back_link($this->u_action));
268
                                }
269
                                else
270
                                {
271
                                        confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
272
                                                'i'                        => $id,
273
                                                'mode'                => $mode,
274
                                                'action'        => $action,
275
                                                'id'                => $reason_id))
276
                                        );
277
                                }
278
279
                        break;
280
281
                        case 'move_up':
282
                        case 'move_down':
283
284
                                $order = request_var('order', 0);
285
                                $order_total = $order * 2 + (($action == 'move_up') ? -1 : 1);
286
287
                                $sql = 'UPDATE ' . REPORTS_REASONS_TABLE . '
288
                                        SET reason_order = ' . $order_total . ' - reason_order
289
                                        WHERE reason_order IN (' . $order . ', ' . (($action == 'move_up') ? $order - 1 : $order + 1) . ')';
290
                                $db->sql_query($sql);
291
292
                        break;
293
                }
294
295
                // By default, check that order is valid and fix it if necessary
296
                $sql = 'SELECT reason_id, reason_order
297
                        FROM ' . REPORTS_REASONS_TABLE . '
298
                        ORDER BY reason_order';
299
                $result = $db->sql_query($sql);
300
301
                if ($row = $db->sql_fetchrow($result))
302
                {
303
                        $order = 0;
304
                        do
305
                        {
306
                                ++$order;
307
                                
308
                                if ($row['reason_order'] != $order)
309
                                {
310
                                        $sql = 'UPDATE ' . REPORTS_REASONS_TABLE . "
311
                                                SET reason_order = $order
312
                                                WHERE reason_id = {$row['reason_id']}";
313
                                        $db->sql_query($sql);
314
                                }
315
                        }
316
                        while ($row = $db->sql_fetchrow($result));
317
                }
318
                $db->sql_freeresult($result);
319
320
                $template->assign_vars(array(
321
                        'U_ACTION'                        => $this->u_action,
322
                        )
323
                );
324
325
                // Reason count
326
                $sql = 'SELECT reason_id, COUNT(reason_id) AS reason_count
327
                        FROM ' . REPORTS_TABLE . '
328
                        GROUP BY reason_id';
329
                $result = $db->sql_query($sql);
330
331
                $reason_count = array();
332
                while ($row = $db->sql_fetchrow($result))
333
                {
334
                        $reason_count[$row['reason_id']] = $row['reason_count'];
335
                }
336
                $db->sql_freeresult($result);
337
338
                $sql = 'SELECT *
339
                        FROM ' . REPORTS_REASONS_TABLE . '
340
                        ORDER BY reason_order ASC';
341
                $result = $db->sql_query($sql);
342
343
                while ($row = $db->sql_fetchrow($result))
344
                {
345
                        $translated = false;
346
                        $other_reason = ($row['reason_title'] == 'other') ? true : false;
347
348
                        // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
349
                        if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
350
                        {
351
                                $row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
352
                                $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
353
354
                                $translated = true;
355
                        }
356
357
                        $template->assign_block_vars('reasons', array(
358
                                'REASON_TITLE'                        => $row['reason_title'],
359
                                'REASON_DESCRIPTION'        => $row['reason_description'],
360
                                'REASON_COUNT'                        => (isset($reason_count[$row['reason_id']])) ? $reason_count[$row['reason_id']] : 0,
361
362
                                'S_TRANSLATED'                => $translated,
363
                                'S_OTHER_REASON'        => $other_reason,
364
365
                                'U_EDIT'                => $this->u_action . '&amp;action=edit&amp;id=' . $row['reason_id'],
366
                                'U_DELETE'                => (!$other_reason) ? $this->u_action . '&amp;action=delete&amp;id=' . $row['reason_id'] : '',
367
                                'U_MOVE_UP'                => $this->u_action . '&amp;action=move_up&amp;order=' . $row['reason_order'],
368
                                'U_MOVE_DOWN'        => $this->u_action . '&amp;action=move_down&amp;order=' . $row['reason_order'])
369
                        );
370
                }
371
                $db->sql_freeresult($result);
372
        }
373
}
374
375
?>