[ Index ] |
PHP Cross Reference of phpBB-3.3.10-deutsch |
[Summary view] [Print] [Text view]
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 */ 17 if (!defined('IN_PHPBB')) 18 { 19 exit; 20 } 21 22 /** 23 * View topic in MCP 24 */ 25 function mcp_topic_view($id, $mode, $action) 26 { 27 global $phpEx, $phpbb_root_path, $config, $request; 28 global $template, $db, $user, $auth, $phpbb_container, $phpbb_dispatcher; 29 30 $url = append_sid("{$phpbb_root_path}mcp.$phpEx?" . phpbb_extra_url()); 31 32 /* @var $pagination \phpbb\pagination */ 33 $pagination = $phpbb_container->get('pagination'); 34 $user->add_lang('viewtopic'); 35 36 $topic_id = $request->variable('t', 0); 37 $topic_info = phpbb_get_topic_data(array($topic_id), false, true); 38 39 if (!count($topic_info)) 40 { 41 trigger_error('TOPIC_NOT_EXIST'); 42 } 43 44 $topic_info = $topic_info[$topic_id]; 45 46 // Set up some vars 47 $icon_id = $request->variable('icon', 0); 48 $subject = $request->variable('subject', '', true); 49 $start = $request->variable('start', 0); 50 $sort_days_old = $request->variable('st_old', 0); 51 $forum_id = $request->variable('f', 0); 52 $to_topic_id = $request->variable('to_topic_id', 0); 53 $to_forum_id = $request->variable('to_forum_id', 0); 54 $sort = isset($_POST['sort']) ? true : false; 55 $submitted_id_list = $request->variable('post_ids', array(0)); 56 $checked_ids = $post_id_list = $request->variable('post_id_list', array(0)); 57 58 // Resync Topic? 59 if ($action == 'resync') 60 { 61 if (!function_exists('mcp_resync_topics')) 62 { 63 include($phpbb_root_path . 'includes/mcp/mcp_forum.' . $phpEx); 64 } 65 mcp_resync_topics(array($topic_id)); 66 } 67 68 // Split Topic? 69 if ($action == 'split_all' || $action == 'split_beyond') 70 { 71 if (!$sort) 72 { 73 split_topic($action, $topic_id, $to_forum_id, $subject); 74 } 75 $action = 'split'; 76 } 77 78 // Merge Posts? 79 if ($action == 'merge_posts') 80 { 81 if (!$sort) 82 { 83 merge_posts($topic_id, $to_topic_id); 84 } 85 $action = 'merge'; 86 } 87 88 if ($action == 'split' && !$subject) 89 { 90 $subject = $topic_info['topic_title']; 91 } 92 93 // Restore or pprove posts? 94 if (($action == 'restore' || $action == 'approve') && $auth->acl_get('m_approve', $topic_info['forum_id'])) 95 { 96 if (!class_exists('mcp_queue')) 97 { 98 include($phpbb_root_path . 'includes/mcp/mcp_queue.' . $phpEx); 99 } 100 101 include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx); 102 include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); 103 104 if (!count($post_id_list)) 105 { 106 trigger_error('NO_POST_SELECTED'); 107 } 108 109 if (!$sort) 110 { 111 mcp_queue::approve_posts($action, $post_id_list, $id, $mode); 112 } 113 } 114 115 // Jumpbox, sort selects and that kind of things 116 make_jumpbox($url . "&i=$id&mode=forum_view", $topic_info['forum_id'], false, 'm_', true); 117 $where_sql = ($action == 'reports') ? 'WHERE post_reported = 1 AND ' : 'WHERE'; 118 119 $sort_days = $total = 0; 120 $sort_key = $sort_dir = ''; 121 $sort_by_sql = $sort_order_sql = array(); 122 phpbb_mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $topic_info['forum_id'], $topic_id, $where_sql); 123 124 /* @var $phpbb_content_visibility \phpbb\content_visibility */ 125 $phpbb_content_visibility = $phpbb_container->get('content.visibility'); 126 $limit_time_sql = ($sort_days) ? 'AND p.post_time >= ' . (time() - ($sort_days * 86400)) : ''; 127 128 if ($total == -1) 129 { 130 $total = $phpbb_content_visibility->get_count('topic_posts', $topic_info, $topic_info['forum_id']); 131 } 132 133 $posts_per_page = max(0, $request->variable('posts_per_page', intval($config['posts_per_page']))); 134 if ($posts_per_page == 0) 135 { 136 $posts_per_page = $total; 137 } 138 139 if ((!empty($sort_days_old) && $sort_days_old != $sort_days) || $total <= $posts_per_page) 140 { 141 $start = 0; 142 } 143 $start = $pagination->validate_start($start, $posts_per_page, $total); 144 145 $sql_where = (($action == 'reports') ? 'p.post_reported = 1 AND ' : '') . ' 146 p.topic_id = ' . $topic_id . ' 147 AND ' . $phpbb_content_visibility->get_visibility_sql('post', $topic_info['forum_id'], 'p.') . ' 148 AND p.poster_id = u.user_id ' . 149 $limit_time_sql; 150 151 $sql_ary = array( 152 'SELECT' => 'u.username, u.username_clean, u.user_colour, p.*', 153 'FROM' => array( 154 POSTS_TABLE => 'p', 155 USERS_TABLE => 'u' 156 ), 157 'LEFT_JOIN' => array(), 158 'WHERE' => $sql_where, 159 'ORDER_BY' => $sort_order_sql, 160 ); 161 162 /** 163 * Event to modify the SQL query before the MCP topic review posts is queried 164 * 165 * @event core.mcp_topic_modify_sql_ary 166 * @var array sql_ary The SQL array to get the data of the MCP topic review posts 167 * @since 3.2.8-RC1 168 */ 169 $vars = array('sql_ary'); 170 extract($phpbb_dispatcher->trigger_event('core.mcp_topic_modify_sql_ary', compact($vars))); 171 172 $sql = $db->sql_build_query('SELECT', $sql_ary); 173 unset($sql_ary); 174 175 $result = $db->sql_query_limit($sql, $posts_per_page, $start); 176 177 $rowset = $post_id_list = array(); 178 while ($row = $db->sql_fetchrow($result)) 179 { 180 $rowset[] = $row; 181 $post_id_list[] = $row['post_id']; 182 } 183 $db->sql_freeresult($result); 184 185 // Get topic tracking info 186 if ($config['load_db_lastread']) 187 { 188 $tmp_topic_data = array($topic_id => $topic_info); 189 $topic_tracking_info = get_topic_tracking($topic_info['forum_id'], $topic_id, $tmp_topic_data, array($topic_info['forum_id'] => $topic_info['forum_mark_time'])); 190 unset($tmp_topic_data); 191 } 192 else 193 { 194 $topic_tracking_info = get_complete_topic_tracking($topic_info['forum_id'], $topic_id); 195 } 196 197 $has_unapproved_posts = $has_deleted_posts = false; 198 199 // Grab extensions 200 $attachments = array(); 201 if ($topic_info['topic_attachment'] && count($post_id_list)) 202 { 203 // Get attachments... 204 if ($auth->acl_get('u_download') && $auth->acl_get('f_download', $topic_info['forum_id'])) 205 { 206 $sql = 'SELECT * 207 FROM ' . ATTACHMENTS_TABLE . ' 208 WHERE ' . $db->sql_in_set('post_msg_id', $post_id_list) . ' 209 AND in_message = 0 210 ORDER BY filetime DESC, post_msg_id ASC'; 211 $result = $db->sql_query($sql); 212 213 while ($row = $db->sql_fetchrow($result)) 214 { 215 $attachments[$row['post_msg_id']][] = $row; 216 } 217 $db->sql_freeresult($result); 218 } 219 } 220 221 /** 222 * Event to modify the post data for the MCP topic review before assigning the posts 223 * 224 * @event core.mcp_topic_modify_post_data 225 * @var array attachments List of attachments post_id => array of attachments 226 * @var int forum_id The forum ID we are currently in 227 * @var int id ID of the tab we are displaying 228 * @var string mode Mode of the MCP page we are displaying 229 * @var array post_id_list Array with post ids we are going to display 230 * @var array rowset Array with the posts data 231 * @var int topic_id The topic ID we are currently reviewing 232 * @since 3.1.7-RC1 233 */ 234 $vars = array( 235 'attachments', 236 'forum_id', 237 'id', 238 'mode', 239 'post_id_list', 240 'rowset', 241 'topic_id', 242 ); 243 extract($phpbb_dispatcher->trigger_event('core.mcp_topic_modify_post_data', compact($vars))); 244 245 foreach ($rowset as $current_row_number => $row) 246 { 247 $message = $row['post_text']; 248 $post_subject = ($row['post_subject'] != '') ? $row['post_subject'] : $topic_info['topic_title']; 249 250 $parse_flags = ($row['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES; 251 $message = generate_text_for_display($message, $row['bbcode_uid'], $row['bbcode_bitfield'], $parse_flags, false); 252 253 if (!empty($attachments[$row['post_id']])) 254 { 255 $update_count = array(); 256 parse_attachments($topic_info['forum_id'], $message, $attachments[$row['post_id']], $update_count); 257 } 258 259 if ($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE) 260 { 261 $has_unapproved_posts = true; 262 } 263 264 if ($row['post_visibility'] == ITEM_DELETED) 265 { 266 $has_deleted_posts = true; 267 } 268 269 $post_unread = (isset($topic_tracking_info[$topic_id]) && $row['post_time'] > $topic_tracking_info[$topic_id]) ? true : false; 270 271 $post_row = array( 272 'POST_AUTHOR_FULL' => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']), 273 'POST_AUTHOR_COLOUR' => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']), 274 'POST_AUTHOR' => get_username_string('username', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']), 275 'U_POST_AUTHOR' => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']), 276 277 'POST_DATE' => $user->format_date($row['post_time']), 278 'POST_SUBJECT' => $post_subject, 279 'MESSAGE' => $message, 280 'POST_ID' => $row['post_id'], 281 'RETURN_TOPIC' => sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $topic_id) . '">', '</a>'), 282 283 'MINI_POST_IMG' => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'), 284 285 'S_POST_REPORTED' => ($row['post_reported'] && $auth->acl_get('m_report', $topic_info['forum_id'])), 286 'S_POST_UNAPPROVED' => (($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE) && $auth->acl_get('m_approve', $topic_info['forum_id'])), 287 'S_POST_DELETED' => ($row['post_visibility'] == ITEM_DELETED && $auth->acl_get('m_approve', $topic_info['forum_id'])), 288 'S_CHECKED' => (($submitted_id_list && !in_array(intval($row['post_id']), $submitted_id_list)) || in_array(intval($row['post_id']), $checked_ids)) ? true : false, 289 'S_HAS_ATTACHMENTS' => (!empty($attachments[$row['post_id']])) ? true : false, 290 291 'U_POST_DETAILS' => "$url&i=$id&p={$row['post_id']}&mode=post_details", 292 'U_MCP_APPROVE' => ($auth->acl_get('m_approve', $topic_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&mode=approve_details&p=' . $row['post_id']) : '', 293 'U_MCP_REPORT' => ($auth->acl_get('m_report', $topic_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&mode=report_details&p=' . $row['post_id']) : '', 294 ); 295 296 /** 297 * Event to modify the template data block for topic reviews in the MCP 298 * 299 * @event core.mcp_topic_review_modify_row 300 * @var int id ID of the tab we are displaying 301 * @var string mode Mode of the MCP page we are displaying 302 * @var int topic_id The topic ID we are currently reviewing 303 * @var int forum_id The forum ID we are currently in 304 * @var int start Start item of this page 305 * @var int current_row_number Number of the post on this page 306 * @var array post_row Template block array of the current post 307 * @var array row Array with original post and user data 308 * @var array topic_info Array with topic data 309 * @var int total Total posts count 310 * @since 3.1.4-RC1 311 */ 312 $vars = array( 313 'id', 314 'mode', 315 'topic_id', 316 'forum_id', 317 'start', 318 'current_row_number', 319 'post_row', 320 'row', 321 'topic_info', 322 'total', 323 ); 324 extract($phpbb_dispatcher->trigger_event('core.mcp_topic_review_modify_row', compact($vars))); 325 326 $template->assign_block_vars('postrow', $post_row); 327 328 // Display not already displayed Attachments for this post, we already parsed them. ;) 329 if (!empty($attachments[$row['post_id']])) 330 { 331 foreach ($attachments[$row['post_id']] as $attachment) 332 { 333 $template->assign_block_vars('postrow.attachment', array( 334 'DISPLAY_ATTACHMENT' => $attachment) 335 ); 336 } 337 } 338 339 unset($rowset[$current_row_number]); 340 } 341 342 // Display topic icons for split topic 343 $s_topic_icons = false; 344 345 if ($auth->acl_gets('m_split', 'm_merge', (int) $topic_info['forum_id'])) 346 { 347 include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx); 348 $s_topic_icons = posting_gen_topic_icons('', $icon_id); 349 350 // Has the user selected a topic for merge? 351 if ($to_topic_id) 352 { 353 $to_topic_info = phpbb_get_topic_data(array($to_topic_id), 'm_merge'); 354 355 if (!count($to_topic_info)) 356 { 357 $to_topic_id = 0; 358 } 359 else 360 { 361 $to_topic_info = $to_topic_info[$to_topic_id]; 362 363 if (!$to_topic_info['enable_icons'] || $auth->acl_get('!f_icons', $topic_info['forum_id'])) 364 { 365 $s_topic_icons = false; 366 } 367 } 368 } 369 } 370 371 $s_hidden_fields = build_hidden_fields(array( 372 'st_old' => $sort_days, 373 'post_ids' => $post_id_list, 374 )); 375 376 $base_url = append_sid("{$phpbb_root_path}mcp.$phpEx", "i=$id&t={$topic_info['topic_id']}&mode=$mode&action=$action&to_topic_id=$to_topic_id&posts_per_page=$posts_per_page&st=$sort_days&sk=$sort_key&sd=$sort_dir"); 377 if ($posts_per_page) 378 { 379 $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total, $posts_per_page, $start); 380 } 381 382 $topic_row = [ 383 'TOPIC_TITLE' => $topic_info['topic_title'], 384 'U_VIEW_TOPIC' => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $topic_info['topic_id']), 385 386 'TO_TOPIC_ID' => $to_topic_id, 387 'TO_TOPIC_INFO' => ($to_topic_id) ? sprintf($user->lang['YOU_SELECTED_TOPIC'], $to_topic_id, '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $to_topic_id) . '">' . $to_topic_info['topic_title'] . '</a>') : '', 388 389 'SPLIT_SUBJECT' => $subject, 390 'POSTS_PER_PAGE' => $posts_per_page, 391 'ACTION' => $action, 392 393 'REPORTED_IMG' => $user->img('icon_topic_reported', 'POST_REPORTED'), 394 'UNAPPROVED_IMG' => $user->img('icon_topic_unapproved', 'POST_UNAPPROVED'), 395 'DELETED_IMG' => $user->img('icon_topic_deleted', 'POST_DELETED_RESTORE'), 396 'INFO_IMG' => $user->img('icon_post_info', 'VIEW_INFO'), 397 398 'S_MCP_ACTION' => "$url&i=$id&mode=$mode&action=$action&start=$start", 399 'S_FORUM_SELECT' => ($to_forum_id) ? make_forum_select($to_forum_id, false, false, true, true, true) : make_forum_select($topic_info['forum_id'], false, false, true, true, true), 400 'S_CAN_SPLIT' => ($auth->acl_get('m_split', $topic_info['forum_id'])) ? true : false, 401 'S_CAN_MERGE' => ($auth->acl_get('m_merge', $topic_info['forum_id'])) ? true : false, 402 'S_CAN_DELETE' => ($auth->acl_get('m_delete', $topic_info['forum_id'])) ? true : false, 403 'S_CAN_APPROVE' => ($has_unapproved_posts && $auth->acl_get('m_approve', $topic_info['forum_id'])) ? true : false, 404 'S_CAN_RESTORE' => ($has_deleted_posts && $auth->acl_get('m_approve', $topic_info['forum_id'])) ? true : false, 405 'S_CAN_LOCK' => ($auth->acl_get('m_lock', $topic_info['forum_id'])) ? true : false, 406 'S_CAN_REPORT' => ($auth->acl_get('m_report', $topic_info['forum_id'])) ? true : false, 407 'S_CAN_SYNC' => $auth->acl_get('m_', $topic_info['forum_id']), 408 'S_REPORT_VIEW' => ($action == 'reports') ? true : false, 409 'S_MERGE_VIEW' => ($action == 'merge') ? true : false, 410 'S_SPLIT_VIEW' => ($action == 'split') ? true : false, 411 412 'S_HIDDEN_FIELDS' => $s_hidden_fields, 413 414 'S_SHOW_TOPIC_ICONS' => $s_topic_icons, 415 'S_TOPIC_ICON' => $icon_id, 416 417 'U_SELECT_TOPIC' => "$url&i=$id&mode=forum_view&action=merge_select" . (($forum_id) ? "&f=$forum_id" : ''), 418 419 'RETURN_TOPIC' => sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", "t={$topic_info['topic_id']}&start=$start") . '">', '</a>'), 420 'RETURN_FORUM' => sprintf($user->lang['RETURN_FORUM'], '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", "f={$topic_info['forum_id']}&start=$start") . '">', '</a>'), 421 422 'TOTAL_POSTS' => $user->lang('VIEW_TOPIC_POSTS', (int) $total), 423 ]; 424 425 /** 426 * Event to modify the template data block for topic data output in the MCP 427 * 428 * @event core.mcp_topic_review_modify_topic_row 429 * @var string action Moderation action type to be performed with the topic 430 * @var bool has_unapproved_posts Flag indicating if the topic has unapproved posts 431 * @var int icon_id Split topic icon ID 432 * @var int id ID of the tab we are displaying 433 * @var string mode Mode of the MCP page we are displaying 434 * @var int topic_id The topic ID we are currently reviewing 435 * @var int forum_id The forum ID we are currently in 436 * @var bool s_topic_icons Flag indicating if split topic icon to be displayed 437 * @var int start Start item of this page 438 * @var string subject Subject of the topic to be split 439 * @var array topic_info Array with topic data 440 * @var int to_forum_id Forum id the topic is being moved to 441 * @var int to_topic_id Topic ID the topic is being merged with 442 * @var array topic_row Topic template data array 443 * @var int total Total posts count 444 * @since 3.3.5-RC1 445 */ 446 $vars = [ 447 'action', 448 'has_unapproved_posts', 449 'icon_id', 450 'id', 451 'mode', 452 'topic_id', 453 'forum_id', 454 's_topic_icons', 455 'start', 456 'subject', 457 'topic_info', 458 'to_forum_id', 459 'to_topic_id', 460 'topic_row', 461 'total', 462 ]; 463 extract($phpbb_dispatcher->trigger_event('core.mcp_topic_review_modify_topic_row', compact($vars))); 464 465 $template->assign_vars($topic_row); 466 } 467 468 /** 469 * Split topic 470 */ 471 function split_topic($action, $topic_id, $to_forum_id, $subject) 472 { 473 global $db, $template, $user, $phpEx, $phpbb_root_path, $auth, $config, $phpbb_log, $request, $phpbb_dispatcher; 474 475 $post_id_list = $request->variable('post_id_list', array(0)); 476 $forum_id = $request->variable('forum_id', 0); 477 $start = $request->variable('start', 0); 478 479 if (!count($post_id_list)) 480 { 481 $template->assign_var('MESSAGE', $user->lang['NO_POST_SELECTED']); 482 return; 483 } 484 485 if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_split'))) 486 { 487 return; 488 } 489 490 $post_id = $post_id_list[0]; 491 $post_info = phpbb_get_post_data(array($post_id)); 492 493 if (!count($post_info)) 494 { 495 $template->assign_var('MESSAGE', $user->lang['NO_POST_SELECTED']); 496 return; 497 } 498 499 $post_info = $post_info[$post_id]; 500 $subject = trim($subject); 501 502 /** 503 * Replace Emojis and other 4bit UTF-8 chars not allowed by MySQL to UCR/NCR. 504 * Using their Numeric Character Reference's Hexadecimal notation. 505 */ 506 $subject = utf8_encode_ucr($subject); 507 508 // Make some tests 509 if (!$subject) 510 { 511 $template->assign_var('MESSAGE', $user->lang['EMPTY_SUBJECT']); 512 return; 513 } 514 515 if ($to_forum_id <= 0) 516 { 517 $template->assign_var('MESSAGE', $user->lang['NO_DESTINATION_FORUM']); 518 return; 519 } 520 521 $forum_info = phpbb_get_forum_data(array($to_forum_id), 'f_post'); 522 523 if (!count($forum_info)) 524 { 525 $template->assign_var('MESSAGE', $user->lang['USER_CANNOT_POST']); 526 return; 527 } 528 529 $forum_info = $forum_info[$to_forum_id]; 530 531 if ($forum_info['forum_type'] != FORUM_POST) 532 { 533 $template->assign_var('MESSAGE', $user->lang['FORUM_NOT_POSTABLE']); 534 return; 535 } 536 537 $redirect = $request->variable('redirect', build_url(array('quickmod'))); 538 539 $s_hidden_fields = build_hidden_fields(array( 540 'i' => 'main', 541 'post_id_list' => $post_id_list, 542 'f' => $forum_id, 543 'mode' => 'topic_view', 544 'start' => $start, 545 'action' => $action, 546 't' => $topic_id, 547 'redirect' => $redirect, 548 'subject' => $subject, 549 'to_forum_id' => $to_forum_id, 550 'icon' => $request->variable('icon', 0)) 551 ); 552 553 if (confirm_box(true)) 554 { 555 if ($action == 'split_beyond') 556 { 557 $sort_days = $total = 0; 558 $sort_key = $sort_dir = ''; 559 $sort_by_sql = $sort_order_sql = array(); 560 phpbb_mcp_sorting('viewtopic', $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id); 561 562 $limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : ''; 563 564 if ($sort_order_sql[0] == 'u') 565 { 566 $sql = 'SELECT p.post_id, p.forum_id, p.post_visibility 567 FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u 568 WHERE p.topic_id = $topic_id 569 AND p.poster_id = u.user_id 570 $limit_time_sql 571 ORDER BY $sort_order_sql"; 572 } 573 else 574 { 575 $sql = 'SELECT p.post_id, p.forum_id, p.post_visibility 576 FROM ' . POSTS_TABLE . " p 577 WHERE p.topic_id = $topic_id 578 $limit_time_sql 579 ORDER BY $sort_order_sql"; 580 } 581 $result = $db->sql_query_limit($sql, 0, $start); 582 583 $store = false; 584 $post_id_list = array(); 585 while ($row = $db->sql_fetchrow($result)) 586 { 587 // If split from selected post (split_beyond), we split the unapproved items too. 588 if (($row['post_visibility'] == ITEM_UNAPPROVED || $row['post_visibility'] == ITEM_REAPPROVE) && !$auth->acl_get('m_approve', $row['forum_id'])) 589 { 590 // continue; 591 } 592 593 // Start to store post_ids as soon as we see the first post that was selected 594 if ($row['post_id'] == $post_id) 595 { 596 $store = true; 597 } 598 599 if ($store) 600 { 601 $post_id_list[] = $row['post_id']; 602 } 603 } 604 $db->sql_freeresult($result); 605 } 606 607 if (!count($post_id_list)) 608 { 609 trigger_error('NO_POST_SELECTED'); 610 } 611 612 $icon_id = $request->variable('icon', 0); 613 614 $sql_ary = array( 615 'forum_id' => $to_forum_id, 616 'topic_title' => $subject, 617 'icon_id' => $icon_id, 618 'topic_visibility' => 1 619 ); 620 621 $sql = 'INSERT INTO ' . TOPICS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); 622 $db->sql_query($sql); 623 624 $to_topic_id = $db->sql_nextid(); 625 move_posts($post_id_list, $to_topic_id); 626 627 $topic_info = phpbb_get_topic_data(array($topic_id)); 628 $topic_info = $topic_info[$topic_id]; 629 630 $phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SPLIT_DESTINATION', false, array( 631 'forum_id' => $to_forum_id, 632 'topic_id' => $to_topic_id, 633 $subject 634 )); 635 $phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_SPLIT_SOURCE', false, array( 636 'forum_id' => $forum_id, 637 'topic_id' => $topic_id, 638 $topic_info['topic_title'] 639 )); 640 641 // Change topic title of first post 642 $sql = 'UPDATE ' . POSTS_TABLE . " 643 SET post_subject = '" . $db->sql_escape($subject) . "' 644 WHERE post_id = {$post_id_list[0]}"; 645 $db->sql_query($sql); 646 647 // Grab data for first post in split topic 648 $sql_array = array( 649 'SELECT' => 'p.post_id, p.forum_id, p.poster_id, p.post_text, f.enable_indexing', 650 'FROM' => array( 651 POSTS_TABLE => 'p', 652 ), 653 'LEFT_JOIN' => array( 654 array( 655 'FROM' => array(FORUMS_TABLE => 'f'), 656 'ON' => 'p.forum_id = f.forum_id', 657 ) 658 ), 659 'WHERE' => "post_id = {$post_id_list[0]}", 660 ); 661 $sql = $db->sql_build_query('SELECT', $sql_array); 662 $result = $db->sql_query($sql); 663 $first_post_data = $db->sql_fetchrow($result); 664 $db->sql_freeresult($result); 665 666 // Index first post as if it were edited 667 if ($first_post_data['enable_indexing']) 668 { 669 // Select the search method and do some additional checks to ensure it can actually be utilised 670 $search_type = $config['search_type']; 671 672 if (!class_exists($search_type)) 673 { 674 trigger_error('NO_SUCH_SEARCH_MODULE'); 675 } 676 677 $error = false; 678 $search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user, $phpbb_dispatcher); 679 680 if ($error) 681 { 682 trigger_error($error); 683 } 684 685 $search->index('edit', $first_post_data['post_id'], $first_post_data['post_text'], $subject, $first_post_data['poster_id'], $first_post_data['forum_id']); 686 } 687 688 // Copy topic subscriptions to new topic 689 $sql = 'SELECT user_id, notify_status 690 FROM ' . TOPICS_WATCH_TABLE . ' 691 WHERE topic_id = ' . $topic_id; 692 $result = $db->sql_query($sql); 693 694 $sql_ary = array(); 695 while ($row = $db->sql_fetchrow($result)) 696 { 697 $sql_ary[] = array( 698 'topic_id' => (int) $to_topic_id, 699 'user_id' => (int) $row['user_id'], 700 'notify_status' => (int) $row['notify_status'], 701 ); 702 } 703 $db->sql_freeresult($result); 704 705 if (count($sql_ary)) 706 { 707 $db->sql_multi_insert(TOPICS_WATCH_TABLE, $sql_ary); 708 } 709 710 // Copy bookmarks to new topic 711 $sql = 'SELECT user_id 712 FROM ' . BOOKMARKS_TABLE . ' 713 WHERE topic_id = ' . $topic_id; 714 $result = $db->sql_query($sql); 715 716 $sql_ary = array(); 717 while ($row = $db->sql_fetchrow($result)) 718 { 719 $sql_ary[] = array( 720 'topic_id' => (int) $to_topic_id, 721 'user_id' => (int) $row['user_id'], 722 ); 723 } 724 $db->sql_freeresult($result); 725 726 if (count($sql_ary)) 727 { 728 $db->sql_multi_insert(BOOKMARKS_TABLE, $sql_ary); 729 } 730 731 $success_msg = 'TOPIC_SPLIT_SUCCESS'; 732 733 // Update forum statistics 734 $config->increment('num_topics', 1, false); 735 736 // Link back to both topics 737 $return_link = sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $post_info['topic_id']) . '">', '</a>') . '<br /><br />' . sprintf($user->lang['RETURN_NEW_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $to_topic_id) . '">', '</a>'); 738 $redirect = $request->variable('redirect', "{$phpbb_root_path}viewtopic.$phpEx?t=$to_topic_id"); 739 $redirect = reapply_sid($redirect); 740 741 /** 742 * Event to access topic data after split 743 * 744 * @event core.mcp_topic_split_topic_after 745 * @var string action Split action type to be performed with the topic 746 * @var int topic_id The topic ID we are currently splitting 747 * @var int forum_id The forum ID we are currently in 748 * @var int start Start item of this page 749 * @var string subject Subject of the topic to be split 750 * @var array topic_info Array with topic data 751 * @var int to_forum_id Forum id the topic is being moved to 752 * @var int to_topic_id Topic ID the topic is being split to 753 * @since 3.3.5-RC1 754 */ 755 $vars = [ 756 'action', 757 'topic_id', 758 'forum_id', 759 'start', 760 'subject', 761 'topic_info', 762 'to_forum_id', 763 'to_topic_id', 764 ]; 765 extract($phpbb_dispatcher->trigger_event('core.mcp_topic_split_topic_after', compact($vars))); 766 767 meta_refresh(3, $redirect); 768 trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link); 769 } 770 else 771 { 772 confirm_box(false, ($action == 'split_all') ? 'SPLIT_TOPIC_ALL' : 'SPLIT_TOPIC_BEYOND', $s_hidden_fields); 773 } 774 } 775 776 /** 777 * Merge selected posts into selected topic 778 */ 779 function merge_posts($topic_id, $to_topic_id) 780 { 781 global $db, $template, $user, $phpEx, $phpbb_root_path, $phpbb_log, $request, $phpbb_dispatcher; 782 783 if (!$to_topic_id) 784 { 785 $template->assign_var('MESSAGE', $user->lang['NO_FINAL_TOPIC_SELECTED']); 786 return; 787 } 788 789 $sync_topics = array($topic_id, $to_topic_id); 790 791 $topic_data = phpbb_get_topic_data($sync_topics, 'm_merge'); 792 793 if (!count($topic_data) || empty($topic_data[$to_topic_id])) 794 { 795 $template->assign_var('MESSAGE', $user->lang['NO_FINAL_TOPIC_SELECTED']); 796 return; 797 } 798 799 $sync_forums = array(); 800 foreach ($topic_data as $data) 801 { 802 $sync_forums[$data['forum_id']] = $data['forum_id']; 803 } 804 805 $topic_data = $topic_data[$to_topic_id]; 806 807 $post_id_list = $request->variable('post_id_list', array(0)); 808 $start = $request->variable('start', 0); 809 810 if (!count($post_id_list)) 811 { 812 $template->assign_var('MESSAGE', $user->lang['NO_POST_SELECTED']); 813 return; 814 } 815 816 if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_merge'))) 817 { 818 return; 819 } 820 821 $redirect = $request->variable('redirect', build_url(array('quickmod'))); 822 823 $s_hidden_fields = build_hidden_fields(array( 824 'i' => 'main', 825 'post_id_list' => $post_id_list, 826 'to_topic_id' => $to_topic_id, 827 'mode' => 'topic_view', 828 'action' => 'merge_posts', 829 'start' => $start, 830 'redirect' => $redirect, 831 't' => $topic_id) 832 ); 833 $return_link = ''; 834 835 if (confirm_box(true)) 836 { 837 $to_forum_id = $topic_data['forum_id']; 838 839 move_posts($post_id_list, $to_topic_id, false); 840 841 $phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_MERGE', false, array( 842 'forum_id' => $to_forum_id, 843 'topic_id' => $to_topic_id, 844 $topic_data['topic_title'] 845 )); 846 847 // Message and return links 848 $success_msg = 'POSTS_MERGED_SUCCESS'; 849 850 // Does the original topic still exist? If yes, link back to it 851 $sql = 'SELECT forum_id 852 FROM ' . POSTS_TABLE . ' 853 WHERE topic_id = ' . $topic_id; 854 $result = $db->sql_query_limit($sql, 1); 855 $row = $db->sql_fetchrow($result); 856 $db->sql_freeresult($result); 857 858 if ($row) 859 { 860 $return_link .= sprintf($user->lang['RETURN_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $topic_id) . '">', '</a>'); 861 } 862 else 863 { 864 if (!function_exists('phpbb_update_rows_avoiding_duplicates_notify_status')) 865 { 866 include($phpbb_root_path . 'includes/functions_database_helper.' . $phpEx); 867 } 868 869 // If the topic no longer exist, we will update the topic watch table. 870 phpbb_update_rows_avoiding_duplicates_notify_status($db, TOPICS_WATCH_TABLE, 'topic_id', array($topic_id), $to_topic_id); 871 872 // If the topic no longer exist, we will update the bookmarks table. 873 phpbb_update_rows_avoiding_duplicates($db, BOOKMARKS_TABLE, 'topic_id', array($topic_id), $to_topic_id); 874 } 875 876 // Re-sync the topics and forums because the auto-sync was deactivated in the call of move_posts() 877 sync('topic_reported', 'topic_id', $sync_topics); 878 sync('topic_attachment', 'topic_id', $sync_topics); 879 sync('topic', 'topic_id', $sync_topics, true); 880 sync('forum', 'forum_id', $sync_forums, true, true); 881 882 // Link to the new topic 883 $return_link .= (($return_link) ? '<br /><br />' : '') . sprintf($user->lang['RETURN_NEW_TOPIC'], '<a href="' . append_sid("{$phpbb_root_path}viewtopic.$phpEx", 't=' . $to_topic_id) . '">', '</a>'); 884 $redirect = $request->variable('redirect', "{$phpbb_root_path}viewtopic.$phpEx?t=$to_topic_id"); 885 $redirect = reapply_sid($redirect); 886 887 /** 888 * Perform additional actions after merging posts. 889 * 890 * @event core.mcp_topics_merge_posts_after 891 * @var int topic_id The topic ID from which posts are being moved 892 * @var int to_topic_id The topic ID to which posts are being moved 893 * @since 3.1.11-RC1 894 */ 895 $vars = array( 896 'topic_id', 897 'to_topic_id', 898 ); 899 extract($phpbb_dispatcher->trigger_event('core.mcp_topics_merge_posts_after', compact($vars))); 900 901 meta_refresh(3, $redirect); 902 trigger_error($user->lang[$success_msg] . '<br /><br />' . $return_link); 903 } 904 else 905 { 906 confirm_box(false, 'MERGE_POSTS', $s_hidden_fields); 907 } 908 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Wed Feb 22 20:16:20 2023 | Cross-referenced by PHPXref 0.7.1 |