Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
mcp_main.php
0001 <?php
0002 /**
0003 *
0004 * This file is part of the phpBB Forum Software package.
0005 *
0006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
0007 * @license GNU General Public License, version 2 (GPL-2.0)
0008 *
0009 * For full copyright and license information, please see
0010 * the docs/CREDITS.txt file.
0011 *
0012 */
0013
0014 /**
0015 * @ignore
0016 */
0017 if (!defined('IN_PHPBB'))
0018 {
0019 exit;
0020 }
0021
0022 /**
0023 * mcp_main
0024 * Handling mcp actions
0025 */
0026 class mcp_main
0027 {
0028 var $p_master;
0029 var $u_action;
0030
0031 function mcp_main(&$p_master)
0032 {
0033 $this->p_master = &$p_master;
0034 }
0035
0036 function main($id, $mode)
0037 {
0038 global $auth, $db, $user, $template, $action;
0039 global $config, $phpbb_root_path, $phpEx, $request;
0040 global $phpbb_dispatcher;
0041
0042 $quickmod = ($mode == 'quickmod') ? true : false;
0043
0044 switch ($action)
0045 {
0046 case 'lock':
0047 case 'unlock':
0048 $topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
0049
0050 if (!sizeof($topic_ids))
0051 {
0052 trigger_error('NO_TOPIC_SELECTED');
0053 }
0054
0055 lock_unlock($action, $topic_ids);
0056 break;
0057
0058 case 'lock_post':
0059 case 'unlock_post':
0060
0061 $post_ids = (!$quickmod) ? request_var('post_id_list', array(0)) : array(request_var('p', 0));
0062
0063 if (!sizeof($post_ids))
0064 {
0065 trigger_error('NO_POST_SELECTED');
0066 }
0067
0068 lock_unlock($action, $post_ids);
0069 break;
0070
0071 case 'make_announce':
0072 case 'make_sticky':
0073 case 'make_global':
0074 case 'make_normal':
0075
0076 $topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
0077
0078 if (!sizeof($topic_ids))
0079 {
0080 trigger_error('NO_TOPIC_SELECTED');
0081 }
0082
0083 change_topic_type($action, $topic_ids);
0084 break;
0085
0086 case 'move':
0087 $user->add_lang('viewtopic');
0088
0089 $topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
0090
0091 if (!sizeof($topic_ids))
0092 {
0093 trigger_error('NO_TOPIC_SELECTED');
0094 }
0095
0096 mcp_move_topic($topic_ids);
0097 break;
0098
0099 case 'fork':
0100 $user->add_lang('viewtopic');
0101
0102 $topic_ids = (!$quickmod) ? request_var('topic_id_list', array(0)) : array(request_var('t', 0));
0103
0104 if (!sizeof($topic_ids))
0105 {
0106 trigger_error('NO_TOPIC_SELECTED');
0107 }
0108
0109 mcp_fork_topic($topic_ids);
0110 break;
0111
0112 case 'delete_topic':
0113 $user->add_lang('viewtopic');
0114
0115 // f parameter is not reliable for permission usage, however we just use it to decide
0116 // which permission we will check later on. So if it is manipulated, we will still catch it later on.
0117 $forum_id = $request->variable('f', 0);
0118 $topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
0119 $soft_delete = (($request->is_set_post('confirm') && !$request->is_set_post('delete_permanent')) || !$auth->acl_get('m_delete', $forum_id)) ? true : false;
0120
0121 if (!sizeof($topic_ids))
0122 {
0123 trigger_error('NO_TOPIC_SELECTED');
0124 }
0125
0126 mcp_delete_topic($topic_ids, $soft_delete, $request->variable('delete_reason', '', true));
0127 break;
0128
0129 case 'delete_post':
0130 $user->add_lang('posting');
0131
0132 // f parameter is not reliable for permission usage, however we just use it to decide
0133 // which permission we will check later on. So if it is manipulated, we will still catch it later on.
0134 $forum_id = $request->variable('f', 0);
0135 $post_ids = (!$quickmod) ? $request->variable('post_id_list', array(0)) : array($request->variable('p', 0));
0136 $soft_delete = (($request->is_set_post('confirm') && !$request->is_set_post('delete_permanent')) || !$auth->acl_get('m_delete', $forum_id)) ? true : false;
0137
0138 if (!sizeof($post_ids))
0139 {
0140 trigger_error('NO_POST_SELECTED');
0141 }
0142
0143 mcp_delete_post($post_ids, $soft_delete, $request->variable('delete_reason', '', true));
0144 break;
0145
0146 case 'restore_topic':
0147 $user->add_lang('posting');
0148
0149 $topic_ids = (!$quickmod) ? $request->variable('topic_id_list', array(0)) : array($request->variable('t', 0));
0150
0151 if (!sizeof($topic_ids))
0152 {
0153 trigger_error('NO_TOPIC_SELECTED');
0154 }
0155
0156 mcp_restore_topic($topic_ids);
0157 break;
0158
0159 default:
0160 /**
0161 * This event allows you to handle custom quickmod options
0162 *
0163 * @event core.modify_quickmod_actions
0164 * @var string action Topic quick moderation action name
0165 * @var bool quickmod Flag indicating whether MCP is in quick moderation mode
0166 * @since 3.1.0-a4
0167 * @change 3.1.0-RC4 Added variables: action, quickmod
0168 */
0169 $vars = array('action', 'quickmod');
0170 extract($phpbb_dispatcher->trigger_event('core.modify_quickmod_actions', compact($vars)));
0171 break;
0172 }
0173
0174 switch ($mode)
0175 {
0176 case 'front':
0177 include($phpbb_root_path . 'includes/mcp/mcp_front.' . $phpEx);
0178
0179 $user->add_lang('acp/common');
0180
0181 mcp_front_view($id, $mode, $action);
0182
0183 $this->tpl_name = 'mcp_front';
0184 $this->page_title = 'MCP_MAIN';
0185 break;
0186
0187 case 'forum_view':
0188 include($phpbb_root_path . 'includes/mcp/mcp_forum.' . $phpEx);
0189
0190 $user->add_lang('viewforum');
0191
0192 $forum_id = request_var('f', 0);
0193
0194 $forum_info = phpbb_get_forum_data($forum_id, 'm_', true);
0195
0196 if (!sizeof($forum_info))
0197 {
0198 $this->main('main', 'front');
0199 return;
0200 }
0201
0202 $forum_info = $forum_info[$forum_id];
0203
0204 mcp_forum_view($id, $mode, $action, $forum_info);
0205
0206 $this->tpl_name = 'mcp_forum';
0207 $this->page_title = 'MCP_MAIN_FORUM_VIEW';
0208 break;
0209
0210 case 'topic_view':
0211 include($phpbb_root_path . 'includes/mcp/mcp_topic.' . $phpEx);
0212
0213 mcp_topic_view($id, $mode, $action);
0214
0215 $this->tpl_name = 'mcp_topic';
0216 $this->page_title = 'MCP_MAIN_TOPIC_VIEW';
0217 break;
0218
0219 case 'post_details':
0220 include($phpbb_root_path . 'includes/mcp/mcp_post.' . $phpEx);
0221
0222 mcp_post_details($id, $mode, $action);
0223
0224 $this->tpl_name = ($action == 'whois') ? 'mcp_whois' : 'mcp_post';
0225 $this->page_title = 'MCP_MAIN_POST_DETAILS';
0226 break;
0227
0228 default:
0229 trigger_error('NO_MODE', E_USER_ERROR);
0230 break;
0231 }
0232 }
0233 }
0234
0235 /**
0236 * Lock/Unlock Topic/Post
0237 */
0238 function lock_unlock($action, $ids)
0239 {
0240 global $auth, $user, $db, $phpEx, $phpbb_root_path, $request;
0241
0242 if ($action == 'lock' || $action == 'unlock')
0243 {
0244 $table = TOPICS_TABLE;
0245 $sql_id = 'topic_id';
0246 $set_id = 'topic_status';
0247 $l_prefix = 'TOPIC';
0248 }
0249 else
0250 {
0251 $table = POSTS_TABLE;
0252 $sql_id = 'post_id';
0253 $set_id = 'post_edit_locked';
0254 $l_prefix = 'POST';
0255 }
0256
0257 $orig_ids = $ids;
0258
0259 if (!phpbb_check_ids($ids, $table, $sql_id, array('m_lock')))
0260 {
0261 // Make sure that for f_user_lock only the lock action is triggered.
0262 if ($action != 'lock')
0263 {
0264 return;
0265 }
0266
0267 $ids = $orig_ids;
0268
0269 if (!phpbb_check_ids($ids, $table, $sql_id, array('f_user_lock')))
0270 {
0271 return;
0272 }
0273 }
0274 unset($orig_ids);
0275
0276 $redirect = request_var('redirect', build_url(array('action', 'quickmod')));
0277 $redirect = reapply_sid($redirect);
0278
0279 $s_hidden_fields = build_hidden_fields(array(
0280 $sql_id . '_list' => $ids,
0281 'action' => $action,
0282 'redirect' => $redirect)
0283 );
0284 $success_msg = '';
0285
0286 if (confirm_box(true))
0287 {
0288 $sql = "UPDATE $table
0289 SET $set_id = " . (($action == 'lock' || $action == 'lock_post') ? ITEM_LOCKED : ITEM_UNLOCKED) . '
0290 WHERE ' . $db->sql_in_set($sql_id, $ids);
0291 $db->sql_query($sql);
0292
0293 $data = ($action == 'lock' || $action == 'unlock') ? phpbb_get_topic_data($ids) : phpbb_get_post_data($ids);
0294
0295 foreach ($data as $id => $row)
0296 {
0297 add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_' . strtoupper($action), $row['topic_title']);
0298 }
0299
0300 $success_msg = $l_prefix . ((sizeof($ids) == 1) ? '' : 'S') . '_' . (($action == 'lock' || $action == 'lock_post') ? 'LOCKED' : 'UNLOCKED') . '_SUCCESS';
0301
0302 meta_refresh(2, $redirect);
0303 $message = $user->lang[$success_msg];
0304
0305 if (!$request->is_ajax())
0306 {
0307 $message .= '<br /><br />' . $user->lang('RETURN_PAGE', '<a href="' . $redirect . '">', '</a>');
0308 }
0309 trigger_error($message);
0310 }
0311 else
0312 {
0313 confirm_box(false, strtoupper($action) . '_' . $l_prefix . ((sizeof($ids) == 1) ? '' : 'S'), $s_hidden_fields);
0314 }
0315
0316 redirect($redirect);
0317 }
0318
0319 /**
0320 * Change Topic Type
0321 */
0322 function change_topic_type($action, $topic_ids)
0323 {
0324 global $auth, $user, $db, $phpEx, $phpbb_root_path, $request;
0325
0326 switch ($action)
0327 {
0328 case 'make_announce':
0329 $new_topic_type = POST_ANNOUNCE;
0330 $check_acl = 'f_announce';
0331 $l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_ANNOUNCEMENT' : 'MCP_MAKE_ANNOUNCEMENTS';
0332 break;
0333
0334 case 'make_global':
0335 $new_topic_type = POST_GLOBAL;
0336 $check_acl = 'f_announce';
0337 $l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_GLOBAL' : 'MCP_MAKE_GLOBALS';
0338 break;
0339
0340 case 'make_sticky':
0341 $new_topic_type = POST_STICKY;
0342 $check_acl = 'f_sticky';
0343 $l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_STICKY' : 'MCP_MAKE_STICKIES';
0344 break;
0345
0346 default:
0347 $new_topic_type = POST_NORMAL;
0348 $check_acl = false;
0349 $l_new_type = (sizeof($topic_ids) == 1) ? 'MCP_MAKE_NORMAL' : 'MCP_MAKE_NORMALS';
0350 break;
0351 }
0352
0353 $forum_id = phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', $check_acl, true);
0354
0355 if ($forum_id === false)
0356 {
0357 return;
0358 }
0359
0360 $redirect = request_var('redirect', build_url(array('action', 'quickmod')));
0361 $redirect = reapply_sid($redirect);
0362
0363 $s_hidden_fields = array(
0364 'topic_id_list' => $topic_ids,
0365 'f' => $forum_id,
0366 'action' => $action,
0367 'redirect' => $redirect,
0368 );
0369 $success_msg = '';
0370
0371 if (confirm_box(true))
0372 {
0373 $sql = 'UPDATE ' . TOPICS_TABLE . "
0374 SET topic_type = $new_topic_type
0375 WHERE " . $db->sql_in_set('topic_id', $topic_ids);
0376 $db->sql_query($sql);
0377
0378 if (($new_topic_type == POST_GLOBAL) && sizeof($topic_ids))
0379 {
0380 // Delete topic shadows for global announcements
0381 $sql = 'DELETE FROM ' . TOPICS_TABLE . '
0382 WHERE ' . $db->sql_in_set('topic_moved_id', $topic_ids);
0383 $db->sql_query($sql);
0384
0385 $sql = 'UPDATE ' . TOPICS_TABLE . "
0386 SET topic_type = $new_topic_type
0387 WHERE " . $db->sql_in_set('topic_id', $topic_ids);
0388 $db->sql_query($sql);
0389 }
0390
0391 $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_TYPE_CHANGED' : 'TOPICS_TYPE_CHANGED';
0392
0393 if (sizeof($topic_ids))
0394 {
0395 $data = phpbb_get_topic_data($topic_ids);
0396
0397 foreach ($data as $topic_id => $row)
0398 {
0399 add_log('mod', $forum_id, $topic_id, 'LOG_TOPIC_TYPE_CHANGED', $row['topic_title']);
0400 }
0401 }
0402
0403 meta_refresh(2, $redirect);
0404 $message = $user->lang[$success_msg];
0405
0406 if (!$request->is_ajax())
0407 {
0408 $message .= '<br /><br />' . $user->lang('RETURN_PAGE', '<a href="' . $redirect . '">', '</a>');
0409 }
0410 trigger_error($message);
0411 }
0412 else
0413 {
0414 confirm_box(false, $l_new_type, build_hidden_fields($s_hidden_fields));
0415 }
0416
0417 redirect($redirect);
0418 }
0419
0420 /**
0421 * Move Topic
0422 */
0423 function mcp_move_topic($topic_ids)
0424 {
0425 global $auth, $user, $db, $template, $phpbb_log, $request;
0426 global $phpEx, $phpbb_root_path;
0427
0428 // Here we limit the operation to one forum only
0429 $forum_id = phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_move'), true);
0430
0431 if ($forum_id === false)
0432 {
0433 return;
0434 }
0435
0436 $to_forum_id = request_var('to_forum_id', 0);
0437 $redirect = request_var('redirect', build_url(array('action', 'quickmod')));
0438 $additional_msg = $success_msg = '';
0439
0440 $s_hidden_fields = build_hidden_fields(array(
0441 'topic_id_list' => $topic_ids,
0442 'f' => $forum_id,
0443 'action' => 'move',
0444 'redirect' => $redirect)
0445 );
0446
0447 if ($to_forum_id)
0448 {
0449 $forum_data = phpbb_get_forum_data($to_forum_id, 'f_post');
0450
0451 if (!sizeof($forum_data))
0452 {
0453 $additional_msg = $user->lang['FORUM_NOT_EXIST'];
0454 }
0455 else
0456 {
0457 $forum_data = $forum_data[$to_forum_id];
0458
0459 if ($forum_data['forum_type'] != FORUM_POST)
0460 {
0461 $additional_msg = $user->lang['FORUM_NOT_POSTABLE'];
0462 }
0463 else if (!$auth->acl_get('f_post', $to_forum_id) || (!$auth->acl_get('m_approve', $to_forum_id) && !$auth->acl_get('f_noapprove', $to_forum_id)))
0464 {
0465 $additional_msg = $user->lang['USER_CANNOT_POST'];
0466 }
0467 else if ($forum_id == $to_forum_id)
0468 {
0469 $additional_msg = $user->lang['CANNOT_MOVE_SAME_FORUM'];
0470 }
0471 }
0472 }
0473 else if (isset($_POST['confirm']))
0474 {
0475 $additional_msg = $user->lang['FORUM_NOT_EXIST'];
0476 }
0477
0478 if (!$to_forum_id || $additional_msg)
0479 {
0480 $request->overwrite('confirm', null, \phpbb\request\request_interface::POST);
0481 $request->overwrite('confirm_key', null);
0482 }
0483
0484 if (confirm_box(true))
0485 {
0486 $topic_data = phpbb_get_topic_data($topic_ids);
0487 $leave_shadow = (isset($_POST['move_leave_shadow'])) ? true : false;
0488
0489 $forum_sync_data = array();
0490
0491 $forum_sync_data[$forum_id] = current($topic_data);
0492 $forum_sync_data[$to_forum_id] = $forum_data;
0493
0494 $topics_moved = $topics_moved_unapproved = $topics_moved_softdeleted = 0;
0495 $posts_moved = $posts_moved_unapproved = $posts_moved_softdeleted = 0;
0496
0497 foreach ($topic_data as $topic_id => $topic_info)
0498 {
0499 if ($topic_info['topic_visibility'] == ITEM_APPROVED)
0500 {
0501 $topics_moved++;
0502 }
0503 else if ($topic_info['topic_visibility'] == ITEM_UNAPPROVED || $topic_info['topic_visibility'] == ITEM_REAPPROVE)
0504 {
0505 $topics_moved_unapproved++;
0506 }
0507 else if ($topic_info['topic_visibility'] == ITEM_DELETED)
0508 {
0509 $topics_moved_softdeleted++;
0510 }
0511
0512 $posts_moved += $topic_info['topic_posts_approved'];
0513 $posts_moved_unapproved += $topic_info['topic_posts_unapproved'];
0514 $posts_moved_softdeleted += $topic_info['topic_posts_softdeleted'];
0515 }
0516
0517 $db->sql_transaction('begin');
0518
0519 // Move topics, but do not resync yet
0520 move_topics($topic_ids, $to_forum_id, false);
0521
0522 if ($request->is_set_post('move_lock_topics') && $auth->acl_get('m_lock', $to_forum_id))
0523 {
0524 $sql = 'UPDATE ' . TOPICS_TABLE . '
0525 SET topic_status = ' . ITEM_LOCKED . '
0526 WHERE ' . $db->sql_in_set('topic_id', $topic_ids);
0527 $db->sql_query($sql);
0528 }
0529
0530 $shadow_topics = 0;
0531 $forum_ids = array($to_forum_id);
0532 foreach ($topic_data as $topic_id => $row)
0533 {
0534 // Get the list of forums to resync
0535 $forum_ids[] = $row['forum_id'];
0536
0537 // We add the $to_forum_id twice, because 'forum_id' is updated
0538 // when the topic is moved again later.
0539 $phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MOVE', false, array(
0540 'forum_id' => (int) $to_forum_id,
0541 'topic_id' => (int) $topic_id,
0542 $row['forum_name'],
0543 $forum_data['forum_name'],
0544 (int) $row['forum_id'],
0545 (int) $forum_data['forum_id'],
0546 ));
0547
0548 // Leave a redirection if required and only if the topic is visible to users
0549 if ($leave_shadow && $row['topic_visibility'] == ITEM_APPROVED && $row['topic_type'] != POST_GLOBAL)
0550 {
0551 $shadow = array(
0552 'forum_id' => (int) $row['forum_id'],
0553 'icon_id' => (int) $row['icon_id'],
0554 'topic_attachment' => (int) $row['topic_attachment'],
0555 'topic_visibility' => ITEM_APPROVED, // a shadow topic is always approved
0556 'topic_reported' => 0, // a shadow topic is never reported
0557 'topic_title' => (string) $row['topic_title'],
0558 'topic_poster' => (int) $row['topic_poster'],
0559 'topic_time' => (int) $row['topic_time'],
0560 'topic_time_limit' => (int) $row['topic_time_limit'],
0561 'topic_views' => (int) $row['topic_views'],
0562 'topic_posts_approved' => (int) $row['topic_posts_approved'],
0563 'topic_posts_unapproved'=> (int) $row['topic_posts_unapproved'],
0564 'topic_posts_softdeleted'=> (int) $row['topic_posts_softdeleted'],
0565 'topic_status' => ITEM_MOVED,
0566 'topic_type' => POST_NORMAL,
0567 'topic_first_post_id' => (int) $row['topic_first_post_id'],
0568 'topic_first_poster_colour'=>(string) $row['topic_first_poster_colour'],
0569 'topic_first_poster_name'=> (string) $row['topic_first_poster_name'],
0570 'topic_last_post_id' => (int) $row['topic_last_post_id'],
0571 'topic_last_poster_id' => (int) $row['topic_last_poster_id'],
0572 'topic_last_poster_colour'=>(string) $row['topic_last_poster_colour'],
0573 'topic_last_poster_name'=> (string) $row['topic_last_poster_name'],
0574 'topic_last_post_subject'=> (string) $row['topic_last_post_subject'],
0575 'topic_last_post_time' => (int) $row['topic_last_post_time'],
0576 'topic_last_view_time' => (int) $row['topic_last_view_time'],
0577 'topic_moved_id' => (int) $row['topic_id'],
0578 'topic_bumped' => (int) $row['topic_bumped'],
0579 'topic_bumper' => (int) $row['topic_bumper'],
0580 'poll_title' => (string) $row['poll_title'],
0581 'poll_start' => (int) $row['poll_start'],
0582 'poll_length' => (int) $row['poll_length'],
0583 'poll_max_options' => (int) $row['poll_max_options'],
0584 'poll_last_vote' => (int) $row['poll_last_vote']
0585 );
0586
0587 $db->sql_query('INSERT INTO ' . TOPICS_TABLE . $db->sql_build_array('INSERT', $shadow));
0588
0589 // Shadow topics only count on new "topics" and not posts... a shadow topic alone has 0 posts
0590 $shadow_topics++;
0591 }
0592 }
0593 unset($topic_data);
0594
0595 $sync_sql = array();
0596 if ($posts_moved)
0597 {
0598 $sync_sql[$to_forum_id][] = 'forum_posts_approved = forum_posts_approved + ' . (int) $posts_moved;
0599 $sync_sql[$forum_id][] = 'forum_posts_approved = forum_posts_approved - ' . (int) $posts_moved;
0600 }
0601 if ($posts_moved_unapproved)
0602 {
0603 $sync_sql[$to_forum_id][] = 'forum_posts_unapproved = forum_posts_unapproved + ' . (int) $posts_moved_unapproved;
0604 $sync_sql[$forum_id][] = 'forum_posts_unapproved = forum_posts_unapproved - ' . (int) $posts_moved_unapproved;
0605 }
0606 if ($posts_moved_softdeleted)
0607 {
0608 $sync_sql[$to_forum_id][] = 'forum_posts_softdeleted = forum_posts_softdeleted + ' . (int) $posts_moved_softdeleted;
0609 $sync_sql[$forum_id][] = 'forum_posts_softdeleted = forum_posts_softdeleted - ' . (int) $posts_moved_softdeleted;
0610 }
0611
0612 if ($topics_moved)
0613 {
0614 $sync_sql[$to_forum_id][] = 'forum_topics_approved = forum_topics_approved + ' . (int) $topics_moved;
0615 if ($topics_moved - $shadow_topics > 0)
0616 {
0617 $sync_sql[$forum_id][] = 'forum_topics_approved = forum_topics_approved - ' . (int) ($topics_moved - $shadow_topics);
0618 }
0619 }
0620 if ($topics_moved_unapproved)
0621 {
0622 $sync_sql[$to_forum_id][] = 'forum_topics_unapproved = forum_topics_unapproved + ' . (int) $topics_moved_unapproved;
0623 $sync_sql[$forum_id][] = 'forum_topics_unapproved = forum_topics_unapproved - ' . (int) $topics_moved_unapproved;
0624 }
0625 if ($topics_moved_softdeleted)
0626 {
0627 $sync_sql[$to_forum_id][] = 'forum_topics_softdeleted = forum_topics_softdeleted + ' . (int) $topics_moved_softdeleted;
0628 $sync_sql[$forum_id][] = 'forum_topics_softdeleted = forum_topics_softdeleted - ' . (int) $topics_moved_softdeleted;
0629 }
0630
0631 $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_MOVED_SUCCESS' : 'TOPICS_MOVED_SUCCESS';
0632
0633 foreach ($sync_sql as $forum_id_key => $array)
0634 {
0635 $sql = 'UPDATE ' . FORUMS_TABLE . '
0636 SET ' . implode(', ', $array) . '
0637 WHERE forum_id = ' . $forum_id_key;
0638 $db->sql_query($sql);
0639 }
0640
0641 $db->sql_transaction('commit');
0642
0643 sync('forum', 'forum_id', array($forum_id, $to_forum_id));
0644 }
0645 else
0646 {
0647 $template->assign_vars(array(
0648 'S_FORUM_SELECT' => make_forum_select($to_forum_id, $forum_id, false, true, true, true),
0649 'S_CAN_LEAVE_SHADOW' => true,
0650 'S_CAN_LOCK_TOPIC' => ($auth->acl_get('m_lock', $to_forum_id)) ? true : false,
0651 'ADDITIONAL_MSG' => $additional_msg)
0652 );
0653
0654 confirm_box(false, 'MOVE_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
0655 }
0656
0657 $redirect = request_var('redirect', "index.$phpEx");
0658 $redirect = reapply_sid($redirect);
0659
0660 if (!$success_msg)
0661 {
0662 redirect($redirect);
0663 }
0664 else
0665 {
0666 meta_refresh(3, $redirect);
0667
0668 $message = $user->lang[$success_msg];
0669 $message .= '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>');
0670 $message .= '<br /><br />' . sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id") . '">', '</a>');
0671 $message .= '<br /><br />' . sprintf($user->lang['RETURN_NEW_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$to_forum_id") . '">', '</a>');
0672
0673 trigger_error($message);
0674 }
0675 }
0676
0677 /**
0678 * Restore Topics
0679 */
0680 function mcp_restore_topic($topic_ids)
0681 {
0682 global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
0683
0684 if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_approve')))
0685 {
0686 return;
0687 }
0688
0689 $redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
0690 $forum_id = $request->variable('f', 0);
0691
0692 $s_hidden_fields = build_hidden_fields(array(
0693 'topic_id_list' => $topic_ids,
0694 'f' => $forum_id,
0695 'action' => 'restore_topic',
0696 'redirect' => $redirect,
0697 ));
0698 $success_msg = '';
0699
0700 if (confirm_box(true))
0701 {
0702 $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_RESTORED_SUCCESS' : 'TOPICS_RESTORED_SUCCESS';
0703
0704 $data = phpbb_get_topic_data($topic_ids);
0705
0706 $phpbb_content_visibility = $phpbb_container->get('content.visibility');
0707 foreach ($data as $topic_id => $row)
0708 {
0709 $return = $phpbb_content_visibility->set_topic_visibility(ITEM_APPROVED, $topic_id, $row['forum_id'], $user->data['user_id'], time(), '');
0710 if (!empty($return))
0711 {
0712 add_log('mod', $row['forum_id'], $topic_id, 'LOG_RESTORE_TOPIC', $row['topic_title'], $row['topic_first_poster_name']);
0713 }
0714 }
0715 }
0716 else
0717 {
0718 confirm_box(false, (sizeof($topic_ids) == 1) ? 'RESTORE_TOPIC' : 'RESTORE_TOPICS', $s_hidden_fields);
0719 }
0720
0721 $topic_id = $request->variable('t', 0);
0722 if (!$request->is_set('quickmod', \phpbb\request\request_interface::REQUEST))
0723 {
0724 $redirect = $request->variable('redirect', "index.$phpEx");
0725 $redirect = reapply_sid($redirect);
0726 $redirect_message = 'PAGE';
0727 }
0728 else if ($topic_id)
0729 {
0730 $redirect = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $topic_id);
0731 $redirect_message = 'TOPIC';
0732 }
0733 else
0734 {
0735 $redirect = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
0736 $redirect_message = 'FORUM';
0737 }
0738
0739 if (!$success_msg)
0740 {
0741 redirect($redirect);
0742 }
0743 else
0744 {
0745 meta_refresh(3, $redirect);
0746 trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_' . $redirect_message], '<a href="' . $redirect . '">', '</a>'));
0747 }
0748 }
0749
0750 /**
0751 * Delete Topics
0752 */
0753 function mcp_delete_topic($topic_ids, $is_soft = false, $soft_delete_reason = '', $action = 'delete_topic')
0754 {
0755 global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
0756
0757 $check_permission = ($is_soft) ? 'm_softdelete' : 'm_delete';
0758 if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array($check_permission)))
0759 {
0760 return;
0761 }
0762
0763 $redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
0764 $forum_id = $request->variable('f', 0);
0765
0766 $s_hidden_fields = array(
0767 'topic_id_list' => $topic_ids,
0768 'f' => $forum_id,
0769 'action' => $action,
0770 'redirect' => $redirect,
0771 );
0772 $success_msg = '';
0773
0774 if (confirm_box(true))
0775 {
0776 $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_DELETED_SUCCESS' : 'TOPICS_DELETED_SUCCESS';
0777
0778 $data = phpbb_get_topic_data($topic_ids);
0779
0780 foreach ($data as $topic_id => $row)
0781 {
0782 if ($row['topic_moved_id'])
0783 {
0784 add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_SHADOW_TOPIC', $row['topic_title']);
0785 }
0786 else
0787 {
0788 // Only soft delete non-shadow topics
0789 if ($is_soft)
0790 {
0791 $phpbb_content_visibility = $phpbb_container->get('content.visibility');
0792 $return = $phpbb_content_visibility->set_topic_visibility(ITEM_DELETED, $topic_id, $row['forum_id'], $user->data['user_id'], time(), $soft_delete_reason);
0793 if (!empty($return))
0794 {
0795 add_log('mod', $row['forum_id'], $topic_id, 'LOG_SOFTDELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name'], $soft_delete_reason);
0796 }
0797 }
0798 else
0799 {
0800 add_log('mod', $row['forum_id'], $topic_id, 'LOG_DELETE_TOPIC', $row['topic_title'], $row['topic_first_poster_name'], $soft_delete_reason);
0801 }
0802 }
0803 }
0804
0805 if (!$is_soft)
0806 {
0807 $return = delete_topics('topic_id', $topic_ids);
0808 }
0809 }
0810 else
0811 {
0812 global $template;
0813
0814 $user->add_lang('posting');
0815
0816 $only_softdeleted = false;
0817 if ($auth->acl_get('m_delete', $forum_id) && $auth->acl_get('m_softdelete', $forum_id))
0818 {
0819 // If there are only soft deleted topics, we display a message why the option is not available
0820 $sql = 'SELECT topic_id
0821 FROM ' . TOPICS_TABLE . '
0822 WHERE ' . $db->sql_in_set('topic_id', $topic_ids) . '
0823 AND topic_visibility <> ' . ITEM_DELETED;
0824 $result = $db->sql_query_limit($sql, 1);
0825 $only_softdeleted = !$db->sql_fetchfield('topic_id');
0826 $db->sql_freeresult($result);
0827 }
0828
0829 $template->assign_vars(array(
0830 'S_SOFTDELETED' => $only_softdeleted,
0831 'S_TOPIC_MODE' => true,
0832 'S_ALLOWED_DELETE' => $auth->acl_get('m_delete', $forum_id),
0833 'S_ALLOWED_SOFTDELETE' => $auth->acl_get('m_softdelete', $forum_id),
0834 ));
0835
0836 $l_confirm = (sizeof($topic_ids) == 1) ? 'DELETE_TOPIC' : 'DELETE_TOPICS';
0837 if ($only_softdeleted)
0838 {
0839 $l_confirm .= '_PERMANENTLY';
0840 $s_hidden_fields['delete_permanent'] = '1';
0841 }
0842 else if (!$auth->acl_get('m_softdelete', $forum_id))
0843 {
0844 $s_hidden_fields['delete_permanent'] = '1';
0845 }
0846
0847 confirm_box(false, $l_confirm, build_hidden_fields($s_hidden_fields), 'confirm_delete_body.html');
0848 }
0849
0850 $topic_id = $request->variable('t', 0);
0851 if (!$request->is_set('quickmod', \phpbb\request\request_interface::REQUEST))
0852 {
0853 $redirect = $request->variable('redirect', "index.$phpEx");
0854 $redirect = reapply_sid($redirect);
0855 $redirect_message = 'PAGE';
0856 }
0857 else if ($is_soft && $topic_id)
0858 {
0859 $redirect = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $topic_id);
0860 $redirect_message = 'TOPIC';
0861 }
0862 else
0863 {
0864 $redirect = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
0865 $redirect_message = 'FORUM';
0866 }
0867
0868 if (!$success_msg)
0869 {
0870 redirect($redirect);
0871 }
0872 else
0873 {
0874 meta_refresh(3, $redirect);
0875 trigger_error($user->lang[$success_msg] . '<br /><br />' . sprintf($user->lang['RETURN_' . $redirect_message], '<a href="' . $redirect . '">', '</a>'));
0876 }
0877 }
0878
0879 /**
0880 * Delete Posts
0881 */
0882 function mcp_delete_post($post_ids, $is_soft = false, $soft_delete_reason = '', $action = 'delete_post')
0883 {
0884 global $auth, $user, $db, $phpEx, $phpbb_root_path, $request, $phpbb_container;
0885
0886 $check_permission = ($is_soft) ? 'm_softdelete' : 'm_delete';
0887 if (!phpbb_check_ids($post_ids, POSTS_TABLE, 'post_id', array($check_permission)))
0888 {
0889 return;
0890 }
0891
0892 $redirect = $request->variable('redirect', build_url(array('action', 'quickmod')));
0893 $forum_id = $request->variable('f', 0);
0894
0895 $s_hidden_fields = array(
0896 'post_id_list' => $post_ids,
0897 'f' => $forum_id,
0898 'action' => $action,
0899 'redirect' => $redirect,
0900 );
0901 $success_msg = '';
0902
0903 if (confirm_box(true) && $is_soft)
0904 {
0905 $post_info = phpbb_get_post_data($post_ids);
0906
0907 $topic_info = $approve_log = array();
0908
0909 // Group the posts by topic_id
0910 foreach ($post_info as $post_id => $post_data)
0911 {
0912 if ($post_data['post_visibility'] != ITEM_APPROVED)
0913 {
0914 continue;
0915 }
0916 $topic_id = (int) $post_data['topic_id'];
0917
0918 $topic_info[$topic_id]['posts'][] = (int) $post_id;
0919 $topic_info[$topic_id]['forum_id'] = (int) $post_data['forum_id'];
0920
0921 if ($post_id == $post_data['topic_first_post_id'])
0922 {
0923 $topic_info[$topic_id]['first_post'] = true;
0924 }
0925
0926 if ($post_id == $post_data['topic_last_post_id'])
0927 {
0928 $topic_info[$topic_id]['last_post'] = true;
0929 }
0930
0931 $approve_log[] = array(
0932 'forum_id' => $post_data['forum_id'],
0933 'topic_id' => $post_data['topic_id'],
0934 'post_subject' => $post_data['post_subject'],
0935 'poster_id' => $post_data['poster_id'],
0936 'post_username' => $post_data['post_username'],
0937 'username' => $post_data['username'],
0938 );
0939 }
0940
0941 $phpbb_content_visibility = $phpbb_container->get('content.visibility');
0942 foreach ($topic_info as $topic_id => $topic_data)
0943 {
0944 $phpbb_content_visibility->set_post_visibility(ITEM_DELETED, $topic_data['posts'], $topic_id, $topic_data['forum_id'], $user->data['user_id'], time(), $soft_delete_reason, isset($topic_data['first_post']), isset($topic_data['last_post']));
0945 }
0946 $affected_topics = sizeof($topic_info);
0947 // None of the topics is really deleted, so a redirect won't hurt much.
0948 $deleted_topics = 0;
0949
0950 $success_msg = (sizeof($post_info) == 1) ? $user->lang['POST_DELETED_SUCCESS'] : $user->lang['POSTS_DELETED_SUCCESS'];
0951
0952 foreach ($approve_log as $row)
0953 {
0954 $post_username = ($row['poster_id'] == ANONYMOUS && !empty($row['post_username'])) ? $row['post_username'] : $row['username'];
0955 add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_SOFTDELETE_POST', $row['post_subject'], $post_username, $soft_delete_reason);
0956 }
0957
0958 $topic_id = $request->variable('t', 0);
0959
0960 // Return links
0961 $return_link = array();
0962 if ($affected_topics == 1 && $topic_id)
0963 {
0964 $return_link[] = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id") . '">', '</a>');
0965 }
0966 $return_link[] = sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
0967
0968 }
0969 else if (confirm_box(true))
0970 {
0971 if (!function_exists('delete_posts'))
0972 {
0973 include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
0974 }
0975
0976 // Count the number of topics that are affected
0977 // I did not use COUNT(DISTINCT ...) because I remember having problems
0978 // with it on older versions of MySQL -- Ashe
0979
0980 $sql = 'SELECT DISTINCT topic_id
0981 FROM ' . POSTS_TABLE . '
0982 WHERE ' . $db->sql_in_set('post_id', $post_ids);
0983 $result = $db->sql_query($sql);
0984
0985 $topic_id_list = array();
0986 while ($row = $db->sql_fetchrow($result))
0987 {
0988 $topic_id_list[] = $row['topic_id'];
0989 }
0990 $affected_topics = sizeof($topic_id_list);
0991 $db->sql_freeresult($result);
0992
0993 $post_data = phpbb_get_post_data($post_ids);
0994
0995 foreach ($post_data as $id => $row)
0996 {
0997 $post_username = ($row['poster_id'] == ANONYMOUS && !empty($row['post_username'])) ? $row['post_username'] : $row['username'];
0998 add_log('mod', $row['forum_id'], $row['topic_id'], 'LOG_DELETE_POST', $row['post_subject'], $post_username, $soft_delete_reason);
0999 }
1000
1001 // Now delete the posts, topics and forums are automatically resync'ed
1002 delete_posts('post_id', $post_ids);
1003
1004 $sql = 'SELECT COUNT(topic_id) AS topics_left
1005 FROM ' . TOPICS_TABLE . '
1006 WHERE ' . $db->sql_in_set('topic_id', $topic_id_list);
1007 $result = $db->sql_query_limit($sql, 1);
1008
1009 $deleted_topics = ($row = $db->sql_fetchrow($result)) ? ($affected_topics - $row['topics_left']) : $affected_topics;
1010 $db->sql_freeresult($result);
1011
1012 $topic_id = $request->variable('t', 0);
1013
1014 // Return links
1015 $return_link = array();
1016 if ($affected_topics == 1 && !$deleted_topics && $topic_id)
1017 {
1018 $return_link[] = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id") . '">', '</a>');
1019 }
1020 $return_link[] = sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>');
1021
1022 if (sizeof($post_ids) == 1)
1023 {
1024 if ($deleted_topics)
1025 {
1026 // We deleted the only post of a topic, which in turn has
1027 // been removed from the database
1028 $success_msg = $user->lang['TOPIC_DELETED_SUCCESS'];
1029 }
1030 else
1031 {
1032 $success_msg = $user->lang['POST_DELETED_SUCCESS'];
1033 }
1034 }
1035 else
1036 {
1037 if ($deleted_topics)
1038 {
1039 // Some of topics disappeared
1040 $success_msg = $user->lang['POSTS_DELETED_SUCCESS'] . '<br /><br />' . $user->lang['EMPTY_TOPICS_REMOVED_WARNING'];
1041 }
1042 else
1043 {
1044 $success_msg = $user->lang['POSTS_DELETED_SUCCESS'];
1045 }
1046 }
1047 }
1048 else
1049 {
1050 global $template;
1051
1052 $user->add_lang('posting');
1053
1054 $only_softdeleted = false;
1055 if ($auth->acl_get('m_delete', $forum_id) && $auth->acl_get('m_softdelete', $forum_id))
1056 {
1057 // If there are only soft deleted posts, we display a message why the option is not available
1058 $sql = 'SELECT post_id
1059 FROM ' . POSTS_TABLE . '
1060 WHERE ' . $db->sql_in_set('post_id', $post_ids) . '
1061 AND post_visibility <> ' . ITEM_DELETED;
1062 $result = $db->sql_query_limit($sql, 1);
1063 $only_softdeleted = !$db->sql_fetchfield('post_id');
1064 $db->sql_freeresult($result);
1065 }
1066
1067 $template->assign_vars(array(
1068 'S_SOFTDELETED' => $only_softdeleted,
1069 'S_ALLOWED_DELETE' => $auth->acl_get('m_delete', $forum_id),
1070 'S_ALLOWED_SOFTDELETE' => $auth->acl_get('m_softdelete', $forum_id),
1071 ));
1072
1073 $l_confirm = (sizeof($post_ids) == 1) ? 'DELETE_POST' : 'DELETE_POSTS';
1074 if ($only_softdeleted)
1075 {
1076 $l_confirm .= '_PERMANENTLY';
1077 $s_hidden_fields['delete_permanent'] = '1';
1078 }
1079 else if (!$auth->acl_get('m_softdelete', $forum_id))
1080 {
1081 $s_hidden_fields['delete_permanent'] = '1';
1082 }
1083
1084 confirm_box(false, $l_confirm, build_hidden_fields($s_hidden_fields), 'confirm_delete_body.html');
1085 }
1086
1087 $redirect = $request->variable('redirect', "index.$phpEx");
1088 $redirect = reapply_sid($redirect);
1089
1090 if (!$success_msg)
1091 {
1092 redirect($redirect);
1093 }
1094 else
1095 {
1096 if ($affected_topics != 1 || $deleted_topics || !$topic_id)
1097 {
1098 $redirect = append_sid("{$phpbb_root_path}mcp.$phpEx", "f=$forum_id&i=main&mode=forum_view", false);
1099 }
1100
1101 meta_refresh(3, $redirect);
1102 trigger_error($success_msg . '<br /><br />' . sprintf($user->lang['RETURN_PAGE'], '<a href="' . $redirect . '">', '</a>') . '<br /><br />' . implode('<br /><br />', $return_link));
1103 }
1104 }
1105
1106 /**
1107 * Fork Topic
1108 */
1109 function mcp_fork_topic($topic_ids)
1110 {
1111 global $auth, $user, $db, $template, $config;
1112 global $phpEx, $phpbb_root_path;
1113
1114 if (!phpbb_check_ids($topic_ids, TOPICS_TABLE, 'topic_id', array('m_')))
1115 {
1116 return;
1117 }
1118
1119 $to_forum_id = request_var('to_forum_id', 0);
1120 $forum_id = request_var('f', 0);
1121 $redirect = request_var('redirect', build_url(array('action', 'quickmod')));
1122 $additional_msg = $success_msg = '';
1123 $counter = array();
1124
1125 $s_hidden_fields = build_hidden_fields(array(
1126 'topic_id_list' => $topic_ids,
1127 'f' => $forum_id,
1128 'action' => 'fork',
1129 'redirect' => $redirect)
1130 );
1131
1132 if ($to_forum_id)
1133 {
1134 $forum_data = phpbb_get_forum_data($to_forum_id, 'f_post');
1135
1136 if (!sizeof($topic_ids))
1137 {
1138 $additional_msg = $user->lang['NO_TOPIC_SELECTED'];
1139 }
1140 else if (!sizeof($forum_data))
1141 {
1142 $additional_msg = $user->lang['FORUM_NOT_EXIST'];
1143 }
1144 else
1145 {
1146 $forum_data = $forum_data[$to_forum_id];
1147
1148 if ($forum_data['forum_type'] != FORUM_POST)
1149 {
1150 $additional_msg = $user->lang['FORUM_NOT_POSTABLE'];
1151 }
1152 else if (!$auth->acl_get('f_post', $to_forum_id))
1153 {
1154 $additional_msg = $user->lang['USER_CANNOT_POST'];
1155 }
1156 }
1157 }
1158 else if (isset($_POST['confirm']))
1159 {
1160 $additional_msg = $user->lang['FORUM_NOT_EXIST'];
1161 }
1162
1163 if ($additional_msg)
1164 {
1165 $request->overwrite('confirm', null, \phpbb\request\request_interface::POST);
1166 $request->overwrite('confirm_key', null);
1167 }
1168
1169 if (confirm_box(true))
1170 {
1171 $topic_data = phpbb_get_topic_data($topic_ids, 'f_post');
1172
1173 $total_topics = $total_topics_unapproved = $total_topics_softdeleted = 0;
1174 $total_posts = $total_posts_unapproved = $total_posts_softdeleted = 0;
1175 $new_topic_id_list = array();
1176
1177 foreach ($topic_data as $topic_id => $topic_row)
1178 {
1179 if (!isset($search_type) && $topic_row['enable_indexing'])
1180 {
1181 // Select the search method and do some additional checks to ensure it can actually be utilised
1182 $search_type = $config['search_type'];
1183
1184 if (!class_exists($search_type))
1185 {
1186 trigger_error('NO_SUCH_SEARCH_MODULE');
1187 }
1188
1189 $error = false;
1190 $search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user);
1191 $search_mode = 'post';
1192
1193 if ($error)
1194 {
1195 trigger_error($error);
1196 }
1197 }
1198 else if (!isset($search_type) && !$topic_row['enable_indexing'])
1199 {
1200 $search_type = false;
1201 }
1202
1203 $sql_ary = array(
1204 'forum_id' => (int) $to_forum_id,
1205 'icon_id' => (int) $topic_row['icon_id'],
1206 'topic_attachment' => (int) $topic_row['topic_attachment'],
1207 'topic_visibility' => (int) $topic_row['topic_visibility'],
1208 'topic_reported' => 0,
1209 'topic_title' => (string) $topic_row['topic_title'],
1210 'topic_poster' => (int) $topic_row['topic_poster'],
1211 'topic_time' => (int) $topic_row['topic_time'],
1212 'topic_posts_approved' => (int) $topic_row['topic_posts_approved'],
1213 'topic_posts_unapproved' => (int) $topic_row['topic_posts_unapproved'],
1214 'topic_posts_softdeleted' => (int) $topic_row['topic_posts_softdeleted'],
1215 'topic_status' => (int) $topic_row['topic_status'],
1216 'topic_type' => (int) $topic_row['topic_type'],
1217 'topic_first_poster_name' => (string) $topic_row['topic_first_poster_name'],
1218 'topic_last_poster_id' => (int) $topic_row['topic_last_poster_id'],
1219 'topic_last_poster_name' => (string) $topic_row['topic_last_poster_name'],
1220 'topic_last_post_time' => (int) $topic_row['topic_last_post_time'],
1221 'topic_last_view_time' => (int) $topic_row['topic_last_view_time'],
1222 'topic_bumped' => (int) $topic_row['topic_bumped'],
1223 'topic_bumper' => (int) $topic_row['topic_bumper'],
1224 'poll_title' => (string) $topic_row['poll_title'],
1225 'poll_start' => (int) $topic_row['poll_start'],
1226 'poll_length' => (int) $topic_row['poll_length'],
1227 'poll_max_options' => (int) $topic_row['poll_max_options'],
1228 'poll_vote_change' => (int) $topic_row['poll_vote_change'],
1229 );
1230
1231 $db->sql_query('INSERT INTO ' . TOPICS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
1232 $new_topic_id = $db->sql_nextid();
1233 $new_topic_id_list[$topic_id] = $new_topic_id;
1234
1235 switch ($topic_row['topic_visibility'])
1236 {
1237 case ITEM_APPROVED:
1238 $total_topics++;
1239 break;
1240 case ITEM_UNAPPROVED:
1241 case ITEM_REAPPROVE:
1242 $total_topics_unapproved++;
1243 break;
1244 case ITEM_DELETED:
1245 $total_topics_softdeleted++;
1246 break;
1247 }
1248
1249 if ($topic_row['poll_start'])
1250 {
1251 $poll_rows = array();
1252
1253 $sql = 'SELECT *
1254 FROM ' . POLL_OPTIONS_TABLE . "
1255 WHERE topic_id = $topic_id";
1256 $result = $db->sql_query($sql);
1257
1258 while ($row = $db->sql_fetchrow($result))
1259 {
1260 $sql_ary = array(
1261 'poll_option_id' => (int) $row['poll_option_id'],
1262 'topic_id' => (int) $new_topic_id,
1263 'poll_option_text' => (string) $row['poll_option_text'],
1264 'poll_option_total' => 0
1265 );
1266
1267 $db->sql_query('INSERT INTO ' . POLL_OPTIONS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
1268 }
1269 }
1270
1271 $sql = 'SELECT *
1272 FROM ' . POSTS_TABLE . "
1273 WHERE topic_id = $topic_id
1274 ORDER BY post_time ASC, post_id ASC";
1275 $result = $db->sql_query($sql);
1276
1277 $post_rows = array();
1278 while ($row = $db->sql_fetchrow($result))
1279 {
1280 $post_rows[] = $row;
1281 }
1282 $db->sql_freeresult($result);
1283
1284 if (!sizeof($post_rows))
1285 {
1286 continue;
1287 }
1288
1289 foreach ($post_rows as $row)
1290 {
1291 $sql_ary = array(
1292 'topic_id' => (int) $new_topic_id,
1293 'forum_id' => (int) $to_forum_id,
1294 'poster_id' => (int) $row['poster_id'],
1295 'icon_id' => (int) $row['icon_id'],
1296 'poster_ip' => (string) $row['poster_ip'],
1297 'post_time' => (int) $row['post_time'],
1298 'post_visibility' => (int) $row['post_visibility'],
1299 'post_reported' => 0,
1300 'enable_bbcode' => (int) $row['enable_bbcode'],
1301 'enable_smilies' => (int) $row['enable_smilies'],
1302 'enable_magic_url' => (int) $row['enable_magic_url'],
1303 'enable_sig' => (int) $row['enable_sig'],
1304 'post_username' => (string) $row['post_username'],
1305 'post_subject' => (string) $row['post_subject'],
1306 'post_text' => (string) $row['post_text'],
1307 'post_edit_reason' => (string) $row['post_edit_reason'],
1308 'post_edit_user' => (int) $row['post_edit_user'],
1309 'post_checksum' => (string) $row['post_checksum'],
1310 'post_attachment' => (int) $row['post_attachment'],
1311 'bbcode_bitfield' => $row['bbcode_bitfield'],
1312 'bbcode_uid' => (string) $row['bbcode_uid'],
1313 'post_edit_time' => (int) $row['post_edit_time'],
1314 'post_edit_count' => (int) $row['post_edit_count'],
1315 'post_edit_locked' => (int) $row['post_edit_locked'],
1316 'post_postcount' => $row['post_postcount'],
1317 );
1318 // Adjust post count only if the post can be incremented to the user counter
1319 if ($row['post_postcount'])
1320 {
1321 if (isset($counter[$row['poster_id']]))
1322 {
1323 ++$counter[$row['poster_id']];
1324 }
1325 else
1326 {
1327 $counter[$row['poster_id']] = 1;
1328 }
1329 }
1330 $db->sql_query('INSERT INTO ' . POSTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary));
1331 $new_post_id = $db->sql_nextid();
1332
1333 switch ($row['post_visibility'])
1334 {
1335 case ITEM_APPROVED:
1336 $total_posts++;
1337 break;
1338 case ITEM_UNAPPROVED:
1339 case ITEM_REAPPROVE:
1340 $total_posts_unapproved++;
1341 break;
1342 case ITEM_DELETED:
1343 $total_posts_softdeleted++;
1344 break;
1345 }
1346
1347 // Copy whether the topic is dotted
1348 markread('post', $to_forum_id, $new_topic_id, 0, $row['poster_id']);
1349
1350 if (!empty($search_type))
1351 {
1352 $search->index($search_mode, $new_post_id, $sql_ary['post_text'], $sql_ary['post_subject'], $sql_ary['poster_id'], ($topic_row['topic_type'] == POST_GLOBAL) ? 0 : $to_forum_id);
1353 $search_mode = 'reply'; // After one we index replies
1354 }
1355
1356 // Copy Attachments
1357 if ($row['post_attachment'])
1358 {
1359 $sql = 'SELECT * FROM ' . ATTACHMENTS_TABLE . "
1360 WHERE post_msg_id = {$row['post_id']}
1361 AND topic_id = $topic_id
1362 AND in_message = 0";
1363 $result = $db->sql_query($sql);
1364
1365 $sql_ary = array();
1366 while ($attach_row = $db->sql_fetchrow($result))
1367 {
1368 $sql_ary[] = array(
1369 'post_msg_id' => (int) $new_post_id,
1370 'topic_id' => (int) $new_topic_id,
1371 'in_message' => 0,
1372 'is_orphan' => (int) $attach_row['is_orphan'],
1373 'poster_id' => (int) $attach_row['poster_id'],
1374 'physical_filename' => (string) utf8_basename($attach_row['physical_filename']),
1375 'real_filename' => (string) utf8_basename($attach_row['real_filename']),
1376 'download_count' => (int) $attach_row['download_count'],
1377 'attach_comment' => (string) $attach_row['attach_comment'],
1378 'extension' => (string) $attach_row['extension'],
1379 'mimetype' => (string) $attach_row['mimetype'],
1380 'filesize' => (int) $attach_row['filesize'],
1381 'filetime' => (int) $attach_row['filetime'],
1382 'thumbnail' => (int) $attach_row['thumbnail']
1383 );
1384 }
1385 $db->sql_freeresult($result);
1386
1387 if (sizeof($sql_ary))
1388 {
1389 $db->sql_multi_insert(ATTACHMENTS_TABLE, $sql_ary);
1390 }
1391 }
1392 }
1393
1394 // Copy topic subscriptions to new topic
1395 $sql = 'SELECT user_id, notify_status
1396 FROM ' . TOPICS_WATCH_TABLE . '
1397 WHERE topic_id = ' . $topic_id;
1398 $result = $db->sql_query($sql);
1399
1400 $sql_ary = array();
1401 while ($row = $db->sql_fetchrow($result))
1402 {
1403 $sql_ary[] = array(
1404 'topic_id' => (int) $new_topic_id,
1405 'user_id' => (int) $row['user_id'],
1406 'notify_status' => (int) $row['notify_status'],
1407 );
1408 }
1409 $db->sql_freeresult($result);
1410
1411 if (sizeof($sql_ary))
1412 {
1413 $db->sql_multi_insert(TOPICS_WATCH_TABLE, $sql_ary);
1414 }
1415
1416 // Copy bookmarks to new topic
1417 $sql = 'SELECT user_id
1418 FROM ' . BOOKMARKS_TABLE . '
1419 WHERE topic_id = ' . $topic_id;
1420 $result = $db->sql_query($sql);
1421
1422 $sql_ary = array();
1423 while ($row = $db->sql_fetchrow($result))
1424 {
1425 $sql_ary[] = array(
1426 'topic_id' => (int) $new_topic_id,
1427 'user_id' => (int) $row['user_id'],
1428 );
1429 }
1430 $db->sql_freeresult($result);
1431
1432 if (sizeof($sql_ary))
1433 {
1434 $db->sql_multi_insert(BOOKMARKS_TABLE, $sql_ary);
1435 }
1436 }
1437
1438 // Sync new topics, parent forums and board stats
1439 $sql = 'UPDATE ' . FORUMS_TABLE . '
1440 SET forum_posts_approved = forum_posts_approved + ' . $total_posts . ',
1441 forum_posts_unapproved = forum_posts_unapproved + ' . $total_posts_unapproved . ',
1442 forum_posts_softdeleted = forum_posts_softdeleted + ' . $total_posts_softdeleted . ',
1443 forum_topics_approved = forum_topics_approved + ' . $total_topics . ',
1444 forum_topics_unapproved = forum_topics_unapproved + ' . $total_topics_unapproved . ',
1445 forum_topics_softdeleted = forum_topics_softdeleted + ' . $total_topics_softdeleted . '
1446 WHERE forum_id = ' . $to_forum_id;
1447 $db->sql_query($sql);
1448
1449 if (!empty($counter))
1450 {
1451 // Do only one query per user and not a query per post.
1452 foreach ($counter as $user_id => $count)
1453 {
1454 $sql = 'UPDATE ' . USERS_TABLE . '
1455 SET user_posts = user_posts + ' . (int) $count . '
1456 WHERE user_id = ' . (int) $user_id;
1457 $db->sql_query($sql);
1458 }
1459 }
1460
1461 sync('topic', 'topic_id', $new_topic_id_list);
1462 sync('forum', 'forum_id', $to_forum_id);
1463
1464 set_config_count('num_topics', sizeof($new_topic_id_list), true);
1465 set_config_count('num_posts', $total_posts, true);
1466
1467 foreach ($new_topic_id_list as $topic_id => $new_topic_id)
1468 {
1469 add_log('mod', $to_forum_id, $new_topic_id, 'LOG_FORK', $topic_row['forum_name']);
1470 }
1471
1472 $success_msg = (sizeof($topic_ids) == 1) ? 'TOPIC_FORKED_SUCCESS' : 'TOPICS_FORKED_SUCCESS';
1473 }
1474 else
1475 {
1476 $template->assign_vars(array(
1477 'S_FORUM_SELECT' => make_forum_select($to_forum_id, false, false, true, true, true),
1478 'S_CAN_LEAVE_SHADOW' => false,
1479 'ADDITIONAL_MSG' => $additional_msg)
1480 );
1481
1482 confirm_box(false, 'FORK_TOPIC' . ((sizeof($topic_ids) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_move.html');
1483 }
1484
1485 $redirect = request_var('redirect', "index.$phpEx");
1486 $redirect = reapply_sid($redirect);
1487
1488 if (!$success_msg)
1489 {
1490 redirect($redirect);
1491 }
1492 else
1493 {
1494 $redirect_url = append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id);
1495 meta_refresh(3, $redirect_url);
1496 $return_link = sprintf($user->lang['RETURN_FORUM'], '<a href="' . $redirect_url . '">', '</a>');
1497
1498 if ($forum_id != $to_forum_id)
1499 {
1500 $return_link .= '<br /><br />' . sprintf($user->lang['RETURN_NEW_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $to_forum_id) . '">', '</a>');
1501 }
1502
1503 trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link);
1504 }
1505 }
1506