source: trunk/forum/includes/acp/acp_reasons.php

Last change on this file was 400, checked in by george, 16 years ago
  • Přidáno: Nové forum phpBB 3.
File size: 11.2 KB
Line 
1<?php
2/**
3*
4* @package acp
5* @version $Id: acp_reasons.php 8479 2008-03-29 00:22:48Z naderman $
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*/
14if (!defined('IN_PHPBB'))
15{
16 exit;
17}
18
19/**
20* @package acp
21*/
22class 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 // Change the reports using this reason to 'other'
237 $sql = "DECLARE @ptrval binary(16)
238
239 SELECT @ptrval = TEXTPTR(report_text)
240 FROM " . REPORTS_TABLE . "
241 WHERE reason_id = " . $reason_id . "
242
243 UPDATETEXT " . REPORTS_TABLE . ".report_text @ptrval 0 0 '" . $db->sql_escape($reason_row['reason_description']) . "\n\n'
244
245 UPDATE " . REPORTS_TABLE . '
246 SET reason_id = ' . $other_reason_id . "
247 WHERE reason_id = $reason_id";
248 break;
249
250 // Teh standard
251 case 'postgres':
252 case 'oracle':
253 case 'firebird':
254 case 'sqlite':
255 // Change the reports using this reason to 'other'
256 $sql = 'UPDATE ' . REPORTS_TABLE . '
257 SET reason_id = ' . $other_reason_id . ", report_text = '" . $db->sql_escape($reason_row['reason_description']) . "\n\n' || report_text
258 WHERE reason_id = $reason_id";
259 break;
260 }
261 $db->sql_query($sql);
262
263 $db->sql_query('DELETE FROM ' . REPORTS_REASONS_TABLE . ' WHERE reason_id = ' . $reason_id);
264
265 add_log('admin', 'LOG_REASON_REMOVED', $reason_row['reason_title']);
266 trigger_error($user->lang['REASON_REMOVED'] . adm_back_link($this->u_action));
267 }
268 else
269 {
270 confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
271 'i' => $id,
272 'mode' => $mode,
273 'action' => $action,
274 'id' => $reason_id))
275 );
276 }
277
278 break;
279
280 case 'move_up':
281 case 'move_down':
282
283 $order = request_var('order', 0);
284 $order_total = $order * 2 + (($action == 'move_up') ? -1 : 1);
285
286 $sql = 'UPDATE ' . REPORTS_REASONS_TABLE . '
287 SET reason_order = ' . $order_total . ' - reason_order
288 WHERE reason_order IN (' . $order . ', ' . (($action == 'move_up') ? $order - 1 : $order + 1) . ')';
289 $db->sql_query($sql);
290
291 break;
292 }
293
294 // By default, check that order is valid and fix it if necessary
295 $sql = 'SELECT reason_id, reason_order
296 FROM ' . REPORTS_REASONS_TABLE . '
297 ORDER BY reason_order';
298 $result = $db->sql_query($sql);
299
300 if ($row = $db->sql_fetchrow($result))
301 {
302 $order = 0;
303 do
304 {
305 ++$order;
306
307 if ($row['reason_order'] != $order)
308 {
309 $sql = 'UPDATE ' . REPORTS_REASONS_TABLE . "
310 SET reason_order = $order
311 WHERE reason_id = {$row['reason_id']}";
312 $db->sql_query($sql);
313 }
314 }
315 while ($row = $db->sql_fetchrow($result));
316 }
317 $db->sql_freeresult($result);
318
319 $template->assign_vars(array(
320 'U_ACTION' => $this->u_action,
321 )
322 );
323
324 // Reason count
325 $sql = 'SELECT reason_id, COUNT(reason_id) AS reason_count
326 FROM ' . REPORTS_TABLE . '
327 GROUP BY reason_id';
328 $result = $db->sql_query($sql);
329
330 $reason_count = array();
331 while ($row = $db->sql_fetchrow($result))
332 {
333 $reason_count[$row['reason_id']] = $row['reason_count'];
334 }
335 $db->sql_freeresult($result);
336
337 $sql = 'SELECT *
338 FROM ' . REPORTS_REASONS_TABLE . '
339 ORDER BY reason_order ASC';
340 $result = $db->sql_query($sql);
341
342 while ($row = $db->sql_fetchrow($result))
343 {
344 $translated = false;
345 $other_reason = ($row['reason_title'] == 'other') ? true : false;
346
347 // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
348 if (isset($user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])]) && isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
349 {
350 $row['reason_description'] = $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])];
351 $row['reason_title'] = $user->lang['report_reasons']['TITLE'][strtoupper($row['reason_title'])];
352
353 $translated = true;
354 }
355
356 $template->assign_block_vars('reasons', array(
357 'REASON_TITLE' => $row['reason_title'],
358 'REASON_DESCRIPTION' => $row['reason_description'],
359 'REASON_COUNT' => (isset($reason_count[$row['reason_id']])) ? $reason_count[$row['reason_id']] : 0,
360
361 'S_TRANSLATED' => $translated,
362 'S_OTHER_REASON' => $other_reason,
363
364 'U_EDIT' => $this->u_action . '&amp;action=edit&amp;id=' . $row['reason_id'],
365 'U_DELETE' => (!$other_reason) ? $this->u_action . '&amp;action=delete&amp;id=' . $row['reason_id'] : '',
366 'U_MOVE_UP' => $this->u_action . '&amp;action=move_up&amp;order=' . $row['reason_order'],
367 'U_MOVE_DOWN' => $this->u_action . '&amp;action=move_down&amp;order=' . $row['reason_order'])
368 );
369 }
370 $db->sql_freeresult($result);
371 }
372}
373
374?>
Note: See TracBrowser for help on using the repository browser.