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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

mcp_queue.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 46.83 KiB


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_queue
0024  * Handling the moderation queue
0025  */
0026  class mcp_queue
0027  {
0028      var $p_master;
0029      var $u_action;
0030   
0031      public function mcp_queue(&$p_master)
0032      {
0033          $this->p_master = &$p_master;
0034      }
0035   
0036      public function main($id, $mode)
0037      {
0038          global $auth, $db, $user, $template, $cache, $request;
0039          global $config, $phpbb_root_path, $phpEx, $action, $phpbb_container;
0040          global $phpbb_dispatcher;
0041   
0042          include_once($phpbb_root_path . 'includes/functions_posting.' . $phpEx);
0043   
0044          $forum_id = request_var('f', 0);
0045          $start = request_var('start', 0);
0046   
0047          $this->page_title = 'MCP_QUEUE';
0048   
0049          switch ($action)
0050          {
0051              case 'approve':
0052              case 'restore':
0053                  include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
0054   
0055                  $post_id_list = $request->variable('post_id_list', array(0));
0056                  $topic_id_list = $request->variable('topic_id_list', array(0));
0057   
0058                  if (!empty($post_id_list))
0059                  {
0060                      self::approve_posts($action, $post_id_list, 'queue', $mode);
0061                  }
0062                  else if (!empty($topic_id_list))
0063                  {
0064                      self::approve_topics($action, $topic_id_list, 'queue', $mode);
0065                  }
0066                  else
0067                  {
0068                      trigger_error('NO_POST_SELECTED');
0069                  }
0070              break;
0071   
0072              case 'delete':
0073                  $post_id_list = $request->variable('post_id_list', array(0));
0074                  $topic_id_list = $request->variable('topic_id_list', array(0));
0075   
0076                  if (!empty($post_id_list))
0077                  {
0078                      if (!function_exists('mcp_delete_post'))
0079                      {
0080                          global $phpbb_root_path, $phpEx;
0081                          include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
0082                      }
0083                      mcp_delete_post($post_id_list, false, '', $action);
0084                  }
0085                  else if (!empty($topic_id_list))
0086                  {
0087                      if (!function_exists('mcp_delete_topic'))
0088                      {
0089                          global $phpbb_root_path, $phpEx;
0090                          include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
0091                      }
0092                      mcp_delete_topic($topic_id_list, false, '', $action);
0093                  }
0094                  else
0095                  {
0096                      trigger_error('NO_POST_SELECTED');
0097                  }
0098              break;
0099   
0100              case 'disapprove':
0101                  $post_id_list = $request->variable('post_id_list', array(0));
0102                  $topic_id_list = $request->variable('topic_id_list', array(0));
0103   
0104                  if (!empty($topic_id_list) && $mode == 'deleted_topics')
0105                  {
0106                      if (!function_exists('mcp_delete_topics'))
0107                      {
0108                          global $phpbb_root_path, $phpEx;
0109                          include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
0110                      }
0111                      mcp_delete_topic($topic_id_list, false, '', 'disapprove');
0112                      return;
0113                  }
0114   
0115                  if (!class_exists('messenger'))
0116                  {
0117                      include($phpbb_root_path . 'includes/functions_messenger.' . $phpEx);
0118                  }
0119   
0120                  if (!empty($topic_id_list))
0121                  {
0122                      $post_visibility = ($mode == 'deleted_topics') ? ITEM_DELETED : array(ITEM_UNAPPROVED, ITEM_REAPPROVE);
0123                      $sql = 'SELECT post_id
0124                          FROM ' . POSTS_TABLE . '
0125                          WHERE ' . $db->sql_in_set('post_visibility', $post_visibility) . '
0126                              AND ' . $db->sql_in_set('topic_id', $topic_id_list);
0127                      $result = $db->sql_query($sql);
0128   
0129                      $post_id_list = array();
0130                      while ($row = $db->sql_fetchrow($result))
0131                      {
0132                          $post_id_list[] = (int) $row['post_id'];
0133                      }
0134                      $db->sql_freeresult($result);
0135                  }
0136   
0137                  if (!empty($post_id_list))
0138                  {
0139                      self::disapprove_posts($post_id_list, 'queue', $mode);
0140                  }
0141                  else
0142                  {
0143                      trigger_error('NO_POST_SELECTED');
0144                  }
0145              break;
0146          }
0147   
0148          switch ($mode)
0149          {
0150              case 'approve_details':
0151   
0152                  $this->tpl_name = 'mcp_post';
0153   
0154                  $user->add_lang(array('posting', 'viewtopic'));
0155   
0156                  $post_id = request_var('p', 0);
0157                  $topic_id = request_var('t', 0);
0158   
0159                  $phpbb_notifications = $phpbb_container->get('notification_manager');
0160   
0161                  if ($topic_id)
0162                  {
0163                      $topic_info = phpbb_get_topic_data(array($topic_id), 'm_approve');
0164                      if (isset($topic_info[$topic_id]['topic_first_post_id']))
0165                      {
0166                          $post_id = (int) $topic_info[$topic_id]['topic_first_post_id'];
0167   
0168                          $phpbb_notifications->mark_notifications_read('notification.type.topic_in_queue', $topic_id, $user->data['user_id']);
0169                      }
0170                      else
0171                      {
0172                          $topic_id = 0;
0173                      }
0174                  }
0175   
0176                  $phpbb_notifications->mark_notifications_read('notification.type.post_in_queue', $post_id, $user->data['user_id']);
0177   
0178                  $post_info = phpbb_get_post_data(array($post_id), 'm_approve', true);
0179   
0180                  if (!sizeof($post_info))
0181                  {
0182                      trigger_error('NO_POST_SELECTED');
0183                  }
0184   
0185                  $post_info = $post_info[$post_id];
0186   
0187                  if ($post_info['topic_first_post_id'] != $post_id && topic_review($post_info['topic_id'], $post_info['forum_id'], 'topic_review', 0, false))
0188                  {
0189                      $template->assign_vars(array(
0190                          'S_TOPIC_REVIEW'    => true,
0191                          'S_BBCODE_ALLOWED'    => $post_info['enable_bbcode'],
0192                          'TOPIC_TITLE'        => $post_info['topic_title'],
0193                      ));
0194                  }
0195   
0196                  $extensions = $attachments = $topic_tracking_info = array();
0197   
0198                  // Get topic tracking info
0199                  if ($config['load_db_lastread'])
0200                  {
0201                      $tmp_topic_data = array($post_info['topic_id'] => $post_info);
0202                      $topic_tracking_info = get_topic_tracking($post_info['forum_id'], $post_info['topic_id'], $tmp_topic_data, array($post_info['forum_id'] => $post_info['forum_mark_time']));
0203                      unset($tmp_topic_data);
0204                  }
0205                  else
0206                  {
0207                      $topic_tracking_info = get_complete_topic_tracking($post_info['forum_id'], $post_info['topic_id']);
0208                  }
0209   
0210                  $post_unread = (isset($topic_tracking_info[$post_info['topic_id']]) && $post_info['post_time'] > $topic_tracking_info[$post_info['topic_id']]) ? true : false;
0211   
0212                  // Process message, leave it uncensored
0213                  $parse_flags = ($post_info['bbcode_bitfield'] ? OPTION_FLAG_BBCODE : 0) | OPTION_FLAG_SMILIES;
0214                  $message = generate_text_for_display($post_info['post_text'], $post_info['bbcode_uid'], $post_info['bbcode_bitfield'], $parse_flags, false);
0215   
0216                  if ($post_info['post_attachment'] && $auth->acl_get('u_download') && $auth->acl_get('f_download', $post_info['forum_id']))
0217                  {
0218                      $extensions = $cache->obtain_attach_extensions($post_info['forum_id']);
0219   
0220                      $sql = 'SELECT *
0221                          FROM ' . ATTACHMENTS_TABLE . '
0222                          WHERE post_msg_id = ' . $post_id . '
0223                              AND in_message = 0
0224                          ORDER BY filetime DESC, post_msg_id ASC';
0225                      $result = $db->sql_query($sql);
0226   
0227                      while ($row = $db->sql_fetchrow($result))
0228                      {
0229                          $attachments[] = $row;
0230                      }
0231                      $db->sql_freeresult($result);
0232   
0233                      if (sizeof($attachments))
0234                      {
0235                          $update_count = array();
0236                          parse_attachments($post_info['forum_id'], $message, $attachments, $update_count);
0237                      }
0238   
0239                      // Display not already displayed Attachments for this post, we already parsed them. ;)
0240                      if (!empty($attachments))
0241                      {
0242                          $template->assign_var('S_HAS_ATTACHMENTS', true);
0243   
0244                          foreach ($attachments as $attachment)
0245                          {
0246                              $template->assign_block_vars('attachment', array(
0247                                  'DISPLAY_ATTACHMENT'    => $attachment,
0248                              ));
0249                          }
0250                      }
0251                  }
0252   
0253                  // Deleting information
0254                  if ($post_info['post_visibility'] == ITEM_DELETED && $post_info['post_delete_user'])
0255                  {
0256                      // User having deleted the post also being the post author?
0257                      if (!$post_info['post_delete_user'] || $post_info['post_delete_user'] == $post_info['poster_id'])
0258                      {
0259                          $display_username = get_username_string('full', $post_info['poster_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']);
0260                      }
0261                      else
0262                      {
0263                          $sql = 'SELECT u.user_id, u.username, u.user_colour
0264                              FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . ' u
0265                              WHERE p.post_id =  ' . $post_info['post_id'] . '
0266                                  AND p.post_delete_user = u.user_id';
0267                          $result = $db->sql_query($sql);
0268                          $post_delete_userinfo = $db->sql_fetchrow($result);
0269                          $db->sql_freeresult($result);
0270                          $display_username = get_username_string('full', $post_info['post_delete_user'], $post_delete_userinfo['username'], $post_delete_userinfo['user_colour']);
0271                      }
0272   
0273                      $l_deleted_by = $user->lang('DELETED_INFORMATION', $display_username, $user->format_date($post_info['post_delete_time'], false, true));
0274                  }
0275                  else
0276                  {
0277                      $l_deleted_by = '';
0278                  }
0279   
0280                  $post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;p=' . $post_info['post_id'] . '#p' . $post_info['post_id']);
0281                  $topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $post_info['forum_id'] . '&amp;t=' . $post_info['topic_id']);
0282   
0283                  $template->assign_vars(array(
0284                      'S_MCP_QUEUE'            => true,
0285                      'U_APPROVE_ACTION'        => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;p=$post_id&amp;f=$forum_id"),
0286                      'S_CAN_VIEWIP'            => $auth->acl_get('m_info', $post_info['forum_id']),
0287                      'S_POST_REPORTED'        => $post_info['post_reported'],
0288                      'S_POST_UNAPPROVED'        => $post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE,
0289                      'S_POST_LOCKED'            => $post_info['post_edit_locked'],
0290                      'S_USER_NOTES'            => true,
0291                      'S_POST_DELETED'        => ($post_info['post_visibility'] == ITEM_DELETED),
0292                      'DELETED_MESSAGE'        => $l_deleted_by,
0293                      'DELETE_REASON'            => $post_info['post_delete_reason'],
0294   
0295                      'U_EDIT'                => ($auth->acl_get('m_edit', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}posting.$phpEx", "mode=edit&amp;f={$post_info['forum_id']}&amp;p={$post_info['post_id']}") : '',
0296                      'U_MCP_APPROVE'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
0297                      'U_MCP_REPORT'            => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=reports&amp;mode=report_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id),
0298                      'U_MCP_USER_NOTES'        => append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=notes&amp;mode=user_notes&amp;u=' . $post_info['user_id']),
0299                      'U_MCP_WARN_USER'        => ($auth->acl_get('m_warn')) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=warn&amp;mode=warn_user&amp;u=' . $post_info['user_id']) : '',
0300                      'U_VIEW_POST'            => $post_url,
0301                      'U_VIEW_TOPIC'            => $topic_url,
0302   
0303                      'MINI_POST_IMG'            => ($post_unread) ? $user->img('icon_post_target_unread', 'UNREAD_POST') : $user->img('icon_post_target', 'POST'),
0304   
0305                      'RETURN_QUEUE'            => sprintf($user->lang['RETURN_QUEUE'], '<a href="' . append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue' . (($topic_id) ? '&amp;mode=unapproved_topics' : '&amp;mode=unapproved_posts')) . '&amp;start=' . $start . '">', '</a>'),
0306                      'RETURN_POST'            => sprintf($user->lang['RETURN_POST'], '<a href="' . $post_url . '">', '</a>'),
0307                      'RETURN_TOPIC_SIMPLE'    => sprintf($user->lang['RETURN_TOPIC_SIMPLE'], '<a href="' . $topic_url . '">', '</a>'),
0308                      'REPORTED_IMG'            => $user->img('icon_topic_reported', $user->lang['POST_REPORTED']),
0309                      'UNAPPROVED_IMG'        => $user->img('icon_topic_unapproved', $user->lang['POST_UNAPPROVED']),
0310                      'EDIT_IMG'                => $user->img('icon_post_edit', $user->lang['EDIT_POST']),
0311   
0312                      'POST_AUTHOR_FULL'        => get_username_string('full', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
0313                      'POST_AUTHOR_COLOUR'    => get_username_string('colour', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
0314                      'POST_AUTHOR'            => get_username_string('username', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
0315                      'U_POST_AUTHOR'            => get_username_string('profile', $post_info['user_id'], $post_info['username'], $post_info['user_colour'], $post_info['post_username']),
0316   
0317                      'POST_PREVIEW'            => $message,
0318                      'POST_SUBJECT'            => $post_info['post_subject'],
0319                      'POST_DATE'                => $user->format_date($post_info['post_time']),
0320                      'POST_IP'                => $post_info['poster_ip'],
0321                      'POST_IPADDR'            => ($auth->acl_get('m_info', $post_info['forum_id']) && request_var('lookup', '')) ? @gethostbyaddr($post_info['poster_ip']) : '',
0322                      'POST_ID'                => $post_info['post_id'],
0323                      'S_FIRST_POST'            => ($post_info['topic_first_post_id'] == $post_id),
0324   
0325                      'U_LOOKUP_IP'            => ($auth->acl_get('m_info', $post_info['forum_id'])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=queue&amp;mode=approve_details&amp;f=' . $post_info['forum_id'] . '&amp;p=' . $post_id . '&amp;lookup=' . $post_info['poster_ip']) . '#ip' : '',
0326                  ));
0327   
0328              break;
0329   
0330              case 'unapproved_topics':
0331              case 'unapproved_posts':
0332              case 'deleted_topics':
0333              case 'deleted_posts':
0334                  $m_perm = 'm_approve';
0335                  $is_topics = ($mode == 'unapproved_topics' || $mode == 'deleted_topics') ? true : false;
0336                  $is_restore = ($mode == 'deleted_posts' || $mode == 'deleted_topics') ? true : false;
0337                  $visibility_const = (!$is_restore) ? array(ITEM_UNAPPROVED, ITEM_REAPPROVE) : ITEM_DELETED;
0338   
0339                  $user->add_lang(array('viewtopic', 'viewforum'));
0340   
0341                  $topic_id = $request->variable('t', 0);
0342                  $forum_info = array();
0343                  $pagination = $phpbb_container->get('pagination');
0344   
0345                  if ($topic_id)
0346                  {
0347                      $topic_info = phpbb_get_topic_data(array($topic_id));
0348   
0349                      if (!sizeof($topic_info))
0350                      {
0351                          trigger_error('TOPIC_NOT_EXIST');
0352                      }
0353   
0354                      $topic_info = $topic_info[$topic_id];
0355                      $forum_id = $topic_info['forum_id'];
0356                  }
0357   
0358                  $forum_list_approve = get_forum_list($m_perm, false, true);
0359                  $forum_list_read = array_flip(get_forum_list('f_read', true, true)); // Flipped so we can isset() the forum IDs
0360   
0361                  // Remove forums we cannot read
0362                  foreach ($forum_list_approve as $k => $forum_data)
0363                  {
0364                      if (!isset($forum_list_read[$forum_data['forum_id']]))
0365                      {
0366                          unset($forum_list_approve[$k]);
0367                      }
0368                  }
0369                  unset($forum_list_read);
0370   
0371                  if (!$forum_id)
0372                  {
0373                      $forum_list = array();
0374                      foreach ($forum_list_approve as $row)
0375                      {
0376                          $forum_list[] = $row['forum_id'];
0377                      }
0378   
0379                      if (!sizeof($forum_list))
0380                      {
0381                          trigger_error('NOT_MODERATOR');
0382                      }
0383   
0384                      $sql = 'SELECT SUM(forum_topics_approved) as sum_forum_topics
0385                          FROM ' . FORUMS_TABLE . '
0386                          WHERE ' . $db->sql_in_set('forum_id', $forum_list);
0387                      $result = $db->sql_query($sql);
0388                      $forum_info['forum_topics_approved'] = (int) $db->sql_fetchfield('sum_forum_topics');
0389                      $db->sql_freeresult($result);
0390                  }
0391                  else
0392                  {
0393                      $forum_info = phpbb_get_forum_data(array($forum_id), $m_perm);
0394   
0395                      if (!sizeof($forum_info))
0396                      {
0397                          trigger_error('NOT_MODERATOR');
0398                      }
0399   
0400                      $forum_info = $forum_info[$forum_id];
0401                      $forum_list = $forum_id;
0402                  }
0403   
0404                  $forum_options = '<option value="0"' . (($forum_id == 0) ? ' selected="selected"' : '') . '>' . $user->lang['ALL_FORUMS'] . '</option>';
0405                  foreach ($forum_list_approve as $row)
0406                  {
0407                      $forum_options .= '<option value="' . $row['forum_id'] . '"' . (($forum_id == $row['forum_id']) ? ' selected="selected"' : '') . '>' . str_repeat('&nbsp; &nbsp;', $row['padding']) . $row['forum_name'] . '</option>';
0408                  }
0409   
0410                  $sort_days = $total = 0;
0411                  $sort_key = $sort_dir = '';
0412                  $sort_by_sql = $sort_order_sql = array();
0413                  phpbb_mcp_sorting($mode, $sort_days, $sort_key, $sort_dir, $sort_by_sql, $sort_order_sql, $total, $forum_id, $topic_id);
0414   
0415                  $forum_topics = ($total == -1) ? $forum_info['forum_topics_approved'] : $total;
0416                  $limit_time_sql = ($sort_days) ? 'AND t.topic_last_post_time >= ' . (time() - ($sort_days * 86400)) : '';
0417   
0418                  $forum_names = array();
0419   
0420                  if (!$is_topics)
0421                  {
0422                      $sql = 'SELECT p.post_id
0423                          FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t' . (($sort_order_sql[0] == 'u') ? ', ' . USERS_TABLE . ' u' : '') . '
0424                          WHERE ' . $db->sql_in_set('p.forum_id', $forum_list) . '
0425                              AND ' . $db->sql_in_set('p.post_visibility', $visibility_const) . '
0426                              ' . (($sort_order_sql[0] == 'u') ? 'AND u.user_id = p.poster_id' : '') . '
0427                              ' . (($topic_id) ? 'AND p.topic_id = ' . $topic_id : '') . "
0428                              AND t.topic_id = p.topic_id
0429                              AND (t.topic_visibility <> p.post_visibility
0430                                  OR t.topic_delete_user = 0)
0431                              $limit_time_sql
0432                          ORDER BY $sort_order_sql";
0433   
0434                      /**
0435                      * Alter sql query to get posts in queue to be accepted
0436                      *
0437                      * @event core.mcp_queue_get_posts_query_before
0438                      * @var    string    sql                        Associative array with the query to be executed
0439                      * @var    array    forum_list                List of forums that contain the posts
0440                      * @var    int        visibility_const        Integer with one of the possible ITEM_* constant values
0441                      * @var    int        topic_id                If topic_id not equal to 0, the topic id to filter the posts to display
0442                      * @var    string    limit_time_sql            String with the SQL code to limit the time interval of the post (Note: May be empty string)
0443                      * @var    string    sort_order_sql            String with the ORDER BY SQL code used in this query
0444                      * @since 3.1.0-RC3
0445                      */
0446                      $vars = array(
0447                          'sql',
0448                          'forum_list',
0449                          'visibility_const',
0450                          'topic_id',
0451                          'limit_time_sql',
0452                          'sort_order_sql',
0453                      );
0454                      extract($phpbb_dispatcher->trigger_event('core.mcp_queue_get_posts_query_before', compact($vars)));
0455   
0456                      $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
0457   
0458                      $i = 0;
0459                      $post_ids = array();
0460                      while ($row = $db->sql_fetchrow($result))
0461                      {
0462                          $post_ids[] = $row['post_id'];
0463                          $row_num[$row['post_id']] = $i++;
0464                      }
0465                      $db->sql_freeresult($result);
0466   
0467                      if (sizeof($post_ids))
0468                      {
0469                          $sql = 'SELECT t.topic_id, t.topic_title, t.forum_id, p.post_id, p.post_subject, p.post_username, p.poster_id, p.post_time, p.post_attachment, u.username, u.username_clean, u.user_colour
0470                              FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . ' t, ' . USERS_TABLE . ' u
0471                              WHERE ' . $db->sql_in_set('p.post_id', $post_ids) . '
0472                                  AND t.topic_id = p.topic_id
0473                                  AND u.user_id = p.poster_id
0474                              ORDER BY ' . $sort_order_sql;
0475                          $result = $db->sql_query($sql);
0476   
0477                          $post_data = $rowset = array();
0478                          while ($row = $db->sql_fetchrow($result))
0479                          {
0480                              $forum_names[] = $row['forum_id'];
0481                              $post_data[$row['post_id']] = $row;
0482                          }
0483                          $db->sql_freeresult($result);
0484   
0485                          foreach ($post_ids as $post_id)
0486                          {
0487                              $rowset[] = $post_data[$post_id];
0488                          }
0489                          unset($post_data, $post_ids);
0490                      }
0491                      else
0492                      {
0493                          $rowset = array();
0494                      }
0495                  }
0496                  else
0497                  {
0498                      $sql = 'SELECT t.forum_id, t.topic_id, t.topic_title, t.topic_title AS post_subject, t.topic_time AS post_time, t.topic_poster AS poster_id, t.topic_first_post_id AS post_id, t.topic_attachment AS post_attachment, t.topic_first_poster_name AS username, t.topic_first_poster_colour AS user_colour
0499                          FROM ' . TOPICS_TABLE . ' t
0500                          WHERE ' . $db->sql_in_set('forum_id', $forum_list) . '
0501                              AND  ' . $db->sql_in_set('topic_visibility', $visibility_const) . "
0502                              AND topic_delete_user <> 0
0503                              $limit_time_sql
0504                          ORDER BY $sort_order_sql";
0505   
0506                      /**
0507                      * Alter sql query to get information on all topics in the list of forums provided.
0508                      *
0509                      * @event core.mcp_queue_get_posts_for_topics_query_before
0510                      * @var    string    sql                        String with the query to be executed
0511                      * @var    array    forum_list                List of forums that contain the posts
0512                      * @var    int        visibility_const        Integer with one of the possible ITEM_* constant values
0513                      * @var    int        topic_id                topic_id in the page request
0514                      * @var    string    limit_time_sql            String with the SQL code to limit the time interval of the post (Note: May be empty string)
0515                      * @var    string    sort_order_sql            String with the ORDER BY SQL code used in this query
0516                      * @since 3.1.0-RC3
0517                      */
0518                      $vars = array(
0519                          'sql',
0520                          'forum_list',
0521                          'visibility_const',
0522                          'topic_id',
0523                          'limit_time_sql',
0524                          'sort_order_sql',
0525                      );
0526                      extract($phpbb_dispatcher->trigger_event('core.mcp_queue_get_posts_for_topics_query_before', compact($vars)));
0527   
0528                      $result = $db->sql_query_limit($sql, $config['topics_per_page'], $start);
0529   
0530                      $rowset = array();
0531                      while ($row = $db->sql_fetchrow($result))
0532                      {
0533                          $forum_names[] = $row['forum_id'];
0534                          $rowset[] = $row;
0535                      }
0536                      $db->sql_freeresult($result);
0537                  }
0538   
0539                  if (sizeof($forum_names))
0540                  {
0541                      // Select the names for the forum_ids
0542                      $sql = 'SELECT forum_id, forum_name
0543                          FROM ' . FORUMS_TABLE . '
0544                          WHERE ' . $db->sql_in_set('forum_id', $forum_names);
0545                      $result = $db->sql_query($sql, 3600);
0546   
0547                      $forum_names = array();
0548                      while ($row = $db->sql_fetchrow($result))
0549                      {
0550                          $forum_names[$row['forum_id']] = $row['forum_name'];
0551                      }
0552                      $db->sql_freeresult($result);
0553                  }
0554   
0555                  foreach ($rowset as $row)
0556                  {
0557                      if (empty($row['post_username']))
0558                      {
0559                          $row['post_username'] = $row['username'] ?: $user->lang['GUEST'];
0560                      }
0561   
0562                      $template->assign_block_vars('postrow', array(
0563                          'U_TOPIC'            => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;t=' . $row['topic_id']),
0564                          'U_VIEWFORUM'        => append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']),
0565                          'U_VIEWPOST'        => append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $row['forum_id'] . '&amp;p=' . $row['post_id']) . (($mode == 'unapproved_posts') ? '#p' . $row['post_id'] : ''),
0566                          'U_VIEW_DETAILS'    => append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&amp;start=$start&amp;mode=approve_details&amp;f={$row['forum_id']}&amp;p={$row['post_id']}" . (($mode == 'unapproved_topics') ? "&amp;t={$row['topic_id']}" : '')),
0567   
0568                          'POST_AUTHOR_FULL'        => get_username_string('full', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
0569                          'POST_AUTHOR_COLOUR'    => get_username_string('colour', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
0570                          'POST_AUTHOR'            => get_username_string('username', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
0571                          'U_POST_AUTHOR'            => get_username_string('profile', $row['poster_id'], $row['username'], $row['user_colour'], $row['post_username']),
0572   
0573                          'POST_ID'        => $row['post_id'],
0574                          'TOPIC_ID'        => $row['topic_id'],
0575                          'FORUM_NAME'    => $forum_names[$row['forum_id']],
0576                          'POST_SUBJECT'    => ($row['post_subject'] != '') ? $row['post_subject'] : $user->lang['NO_SUBJECT'],
0577                          'TOPIC_TITLE'    => $row['topic_title'],
0578                          'POST_TIME'        => $user->format_date($row['post_time']),
0579                          'ATTACH_ICON_IMG'    => ($auth->acl_get('u_download') && $auth->acl_get('f_download', $row['forum_id']) && $row['post_attachment']) ? $user->img('icon_topic_attach', $user->lang['TOTAL_ATTACHMENTS']) : '',
0580                      ));
0581                  }
0582                  unset($rowset, $forum_names);
0583   
0584                  $base_url = $this->u_action . "&amp;f=$forum_id&amp;st=$sort_days&amp;sk=$sort_key&amp;sd=$sort_dir";
0585                  $pagination->generate_template_pagination($base_url, 'pagination', 'start', $total, $config['topics_per_page'], $start);
0586   
0587                  // Now display the page
0588                  $template->assign_vars(array(
0589                      'L_DISPLAY_ITEMS'        => (!$is_topics) ? $user->lang['DISPLAY_POSTS'] : $user->lang['DISPLAY_TOPICS'],
0590                      'L_EXPLAIN'                => $user->lang['MCP_QUEUE_' . strtoupper($mode) . '_EXPLAIN'],
0591                      'L_TITLE'                => $user->lang['MCP_QUEUE_' . strtoupper($mode)],
0592                      'L_ONLY_TOPIC'            => ($topic_id) ? sprintf($user->lang['ONLY_TOPIC'], $topic_info['topic_title']) : '',
0593   
0594                      'S_FORUM_OPTIONS'        => $forum_options,
0595                      'S_MCP_ACTION'            => build_url(array('t', 'f', 'sd', 'st', 'sk')),
0596                      'S_TOPICS'                => $is_topics,
0597                      'S_RESTORE'                => $is_restore,
0598   
0599                      'TOPIC_ID'                => $topic_id,
0600                      'TOTAL'                    => $user->lang(((!$is_topics) ? 'VIEW_TOPIC_POSTS' : 'VIEW_FORUM_TOPICS'), (int) $total),
0601                  ));
0602   
0603                  $this->tpl_name = 'mcp_queue';
0604              break;
0605          }
0606      }
0607   
0608      /**
0609      * Approve/Restore posts
0610      *
0611      * @param $action        string    Action we perform on the posts ('approve' or 'restore')
0612      * @param $post_id_list    array    IDs of the posts to approve/restore
0613      * @param $id            mixed    Category of the current active module
0614      * @param $mode            string    Active module
0615      * @return null
0616      */
0617      static public function approve_posts($action, $post_id_list, $id, $mode)
0618      {
0619          global $db, $template, $user, $config, $request, $phpbb_container;
0620          global $phpEx, $phpbb_root_path;
0621   
0622          if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
0623          {
0624              trigger_error('NOT_AUTHORISED');
0625          }
0626   
0627          $redirect = $request->variable('redirect', build_url(array('quickmod')));
0628          $redirect = reapply_sid($redirect);
0629          $success_msg = $post_url = '';
0630          $approve_log = array();
0631          $num_topics = 0;
0632   
0633          $s_hidden_fields = build_hidden_fields(array(
0634              'i'                => $id,
0635              'mode'            => $mode,
0636              'post_id_list'    => $post_id_list,
0637              'action'        => $action,
0638              'redirect'        => $redirect,
0639          ));
0640   
0641          $post_info = phpbb_get_post_data($post_id_list, 'm_approve');
0642   
0643          if (confirm_box(true))
0644          {
0645              $notify_poster = ($action == 'approve' && isset($_REQUEST['notify_poster']));
0646   
0647              $topic_info = array();
0648   
0649              // Group the posts by topic_id
0650              foreach ($post_info as $post_id => $post_data)
0651              {
0652                  if ($post_data['post_visibility'] == ITEM_APPROVED)
0653                  {
0654                      continue;
0655                  }
0656                  $topic_id = (int) $post_data['topic_id'];
0657   
0658                  $topic_info[$topic_id]['posts'][] = (int) $post_id;
0659                  $topic_info[$topic_id]['forum_id'] = (int) $post_data['forum_id'];
0660   
0661                  // Refresh the first post, if the time or id is older then the current one
0662                  if ($post_id <= $post_data['topic_first_post_id'] || $post_data['post_time'] <= $post_data['topic_time'])
0663                  {
0664                      $topic_info[$topic_id]['first_post'] = true;
0665                  }
0666   
0667                  // Refresh the last post, if the time or id is newer then the current one
0668                  if ($post_id >= $post_data['topic_last_post_id'] || $post_data['post_time'] >= $post_data['topic_last_post_time'])
0669                  {
0670                      $topic_info[$topic_id]['last_post'] = true;
0671                  }
0672   
0673                  $post_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$post_data['forum_id']}&amp;t={$post_data['topic_id']}&amp;p={$post_data['post_id']}") . '#p' . $post_data['post_id'];
0674   
0675                  $approve_log[] = array(
0676                      'forum_id'        => $post_data['forum_id'],
0677                      'topic_id'        => $post_data['topic_id'],
0678                      'post_subject'    => $post_data['post_subject'],
0679                  );
0680              }
0681   
0682              $phpbb_content_visibility = $phpbb_container->get('content.visibility');
0683              foreach ($topic_info as $topic_id => $topic_data)
0684              {
0685                  $phpbb_content_visibility->set_post_visibility(ITEM_APPROVED, $topic_data['posts'], $topic_id, $topic_data['forum_id'], $user->data['user_id'], time(), '', isset($topic_data['first_post']), isset($topic_data['last_post']));
0686              }
0687   
0688              foreach ($approve_log as $log_data)
0689              {
0690                  add_log('mod', $log_data['forum_id'], $log_data['topic_id'], 'LOG_POST_' . strtoupper($action) . 'D', $log_data['post_subject']);
0691              }
0692   
0693              // Only send out the mails, when the posts are being approved
0694              if ($action == 'approve')
0695              {
0696                  $phpbb_notifications = $phpbb_container->get('notification_manager');
0697   
0698                  // Handle notifications
0699                  foreach ($post_info as $post_id => $post_data)
0700                  {
0701                      // A single topic approval may also happen here, so handle deleting the respective notification.
0702                      if (!$post_data['topic_posts_approved'])
0703                      {
0704                          $phpbb_notifications->delete_notifications('notification.type.topic_in_queue', $post_data['topic_id']);
0705   
0706                          if ($post_data['post_visibility'] == ITEM_UNAPPROVED)
0707                          {
0708                              $phpbb_notifications->add_notifications(array('notification.type.topic'), $post_data);
0709                          }
0710                          if ($post_data['post_visibility'] != ITEM_APPROVED)
0711                          {
0712                              $num_topics++;
0713                          }
0714                      }
0715                      else
0716                      {
0717                          // Only add notifications, if we are not reapproving post
0718                          // When the topic was already approved, but was edited and
0719                          // now needs re-approval, we don't want to notify the users
0720                          // again.
0721                          if ($post_data['post_visibility'] == ITEM_UNAPPROVED)
0722                          {
0723                              $phpbb_notifications->add_notifications(array(
0724                                  'notification.type.bookmark',
0725                                  'notification.type.post',
0726                              ), $post_data);
0727                          }
0728                      }
0729                      $phpbb_notifications->add_notifications(array('notification.type.quote'), $post_data);
0730                      $phpbb_notifications->delete_notifications('notification.type.post_in_queue', $post_id);
0731   
0732                      $phpbb_notifications->mark_notifications_read(array(
0733                          'notification.type.quote',
0734                          'notification.type.bookmark',
0735                          'notification.type.post',
0736                      ), $post_data['post_id'], $user->data['user_id']);
0737   
0738                      // Notify Poster?
0739                      if ($notify_poster)
0740                      {
0741                          if ($post_data['poster_id'] == ANONYMOUS)
0742                          {
0743                              continue;
0744                          }
0745   
0746                          if (!$post_data['topic_posts_approved'])
0747                          {
0748                              $phpbb_notifications->add_notifications('notification.type.approve_topic', $post_data);
0749                          }
0750                          else
0751                          {
0752                              $phpbb_notifications->add_notifications('notification.type.approve_post', $post_data);
0753                          }
0754                      }
0755                  }
0756              }
0757   
0758              if ($num_topics >= 1)
0759              {
0760                  $success_msg = ($num_topics == 1) ? 'TOPIC_' . strtoupper($action) . 'D_SUCCESS' : 'TOPICS_' . strtoupper($action) . 'D_SUCCESS';
0761              }
0762              else
0763              {
0764                  $success_msg = (sizeof($post_info) == 1) ? 'POST_' . strtoupper($action) . 'D_SUCCESS' : 'POSTS_' . strtoupper($action) . 'D_SUCCESS';
0765              }
0766   
0767              meta_refresh(3, $redirect);
0768              $message = $user->lang[$success_msg];
0769   
0770              if ($request->is_ajax())
0771              {
0772                  $json_response = new \phpbb\json_response;
0773                  $json_response->send(array(
0774                      'MESSAGE_TITLE'        => $user->lang['INFORMATION'],
0775                      'MESSAGE_TEXT'        => $message,
0776                      'REFRESH_DATA'        => null,
0777                      'visible'            => true,
0778                  ));
0779              }
0780              $message .= '<br /><br />' . $user->lang('RETURN_PAGE', '<a href="' . $redirect . '">', '</a>');
0781   
0782              // If approving one post, also give links back to post...
0783              if (sizeof($post_info) == 1 && $post_url)
0784              {
0785                  $message .= '<br /><br />' . $user->lang('RETURN_POST', '<a href="' . $post_url . '">', '</a>');
0786              }
0787              trigger_error($message);
0788          }
0789          else
0790          {
0791              $show_notify = false;
0792   
0793              if ($action == 'approve')
0794              {
0795                  foreach ($post_info as $post_data)
0796                  {
0797                      if (!$post_data['topic_posts_approved'])
0798                      {
0799                          $num_topics++;
0800                      }
0801   
0802                      if (!$show_notify && $post_data['poster_id'] != ANONYMOUS)
0803                      {
0804                          $show_notify = true;
0805                      }
0806                  }
0807              }
0808   
0809              $template->assign_vars(array(
0810                  'S_NOTIFY_POSTER'            => $show_notify,
0811                  'S_' . strtoupper($action)    => true,
0812              ));
0813   
0814              // Create the confirm box message
0815              $action_msg = strtoupper($action);
0816              $num_posts = sizeof($post_id_list) - $num_topics;
0817              if ($num_topics > 0 && $num_posts <= 0)
0818              {
0819                  $action_msg .= '_TOPIC' . (($num_topics == 1) ? '' : 'S');
0820              }
0821              else
0822              {
0823                  $action_msg .= '_POST' . ((sizeof($post_id_list) == 1) ? '' : 'S');
0824              }
0825              confirm_box(false, $action_msg, $s_hidden_fields, 'mcp_approve.html');
0826          }
0827   
0828          redirect($redirect);
0829      }
0830   
0831      /**
0832      * Approve/Restore topics
0833      *
0834      * @param $action        string    Action we perform on the posts ('approve' or 'restore')
0835      * @param $topic_id_list    array    IDs of the topics to approve/restore
0836      * @param $id            mixed    Category of the current active module
0837      * @param $mode            string    Active module
0838      * @return null
0839      */
0840      static public function approve_topics($action, $topic_id_list, $id, $mode)
0841      {
0842          global $db, $template, $user, $config;
0843          global $phpEx, $phpbb_root_path, $request, $phpbb_container;
0844   
0845          if (!phpbb_check_ids($topic_id_list, TOPICS_TABLE, 'topic_id', array('m_approve')))
0846          {
0847              trigger_error('NOT_AUTHORISED');
0848          }
0849   
0850          $redirect = $request->variable('redirect', build_url(array('quickmod')));
0851          $redirect = reapply_sid($redirect);
0852          $success_msg = $topic_url = '';
0853          $approve_log = array();
0854   
0855          $s_hidden_fields = build_hidden_fields(array(
0856              'i'                => $id,
0857              'mode'            => $mode,
0858              'topic_id_list'    => $topic_id_list,
0859              'action'        => $action,
0860              'redirect'        => $redirect,
0861          ));
0862   
0863          $topic_info = phpbb_get_topic_data($topic_id_list, 'm_approve');
0864   
0865          if (confirm_box(true))
0866          {
0867              $notify_poster = ($action == 'approve' && isset($_REQUEST['notify_poster'])) ? true : false;
0868   
0869              $phpbb_content_visibility = $phpbb_container->get('content.visibility');
0870              $first_post_ids = array();
0871   
0872              foreach ($topic_info as $topic_id => $topic_data)
0873              {
0874                  $phpbb_content_visibility->set_topic_visibility(ITEM_APPROVED, $topic_id, $topic_data['forum_id'], $user->data['user_id'], time(), '');
0875                  $first_post_ids[$topic_id] = (int) $topic_data['topic_first_post_id'];
0876   
0877                  $topic_url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f={$topic_data['forum_id']}&amp;t={$topic_id}");
0878   
0879                  $approve_log[] = array(
0880                      'forum_id'        => $topic_data['forum_id'],
0881                      'topic_id'        => $topic_data['topic_id'],
0882                      'topic_title'    => $topic_data['topic_title'],
0883                  );
0884              }
0885   
0886              if (sizeof($topic_info) >= 1)
0887              {
0888                  $success_msg = (sizeof($topic_info) == 1) ? 'TOPIC_' . strtoupper($action) . 'D_SUCCESS' : 'TOPICS_' . strtoupper($action) . 'D_SUCCESS';
0889              }
0890   
0891              foreach ($approve_log as $log_data)
0892              {
0893                  add_log('mod', $log_data['forum_id'], $log_data['topic_id'], 'LOG_TOPIC_' . strtoupper($action) . 'D', $log_data['topic_title']);
0894              }
0895   
0896              // Only send out the mails, when the posts are being approved
0897              if ($action == 'approve')
0898              {
0899                  // Grab the first post text as it's needed for the quote notification.
0900                  $sql = 'SELECT topic_id, post_text
0901                      FROM ' . POSTS_TABLE . '
0902                      WHERE ' . $db->sql_in_set('post_id', $first_post_ids);
0903                  $result = $db->sql_query($sql);
0904   
0905                  while ($row = $db->sql_fetchrow($result))
0906                  {
0907                      $topic_info[$row['topic_id']]['post_text'] = $row['post_text'];
0908                  }
0909                  $db->sql_freeresult($result);
0910   
0911                  // Handle notifications
0912                  $phpbb_notifications = $phpbb_container->get('notification_manager');
0913   
0914                  foreach ($topic_info as $topic_id => $topic_data)
0915                  {
0916                      $topic_data = array_merge($topic_data, array(
0917                          'post_id'        => $topic_data['topic_first_post_id'],
0918                          'post_subject'    => $topic_data['topic_title'],
0919                          'post_time'        => $topic_data['topic_time'],
0920                          'poster_id'        => $topic_data['topic_poster'],
0921                          'post_username'    => $topic_data['topic_first_poster_name'],
0922                      ));
0923   
0924                      $phpbb_notifications->delete_notifications('notification.type.topic_in_queue', $topic_id);
0925   
0926                      // Only add notifications, if we are not reapproving post
0927                      // When the topic was already approved, but was edited and
0928                      // now needs re-approval, we don't want to notify the users
0929                      // again.
0930                      if ($topic_data['topic_visibility'] == ITEM_UNAPPROVED)
0931                      {
0932                          $phpbb_notifications->add_notifications(array(
0933                              'notification.type.quote',
0934                              'notification.type.topic',
0935                          ), $topic_data);
0936                      }
0937   
0938                      $phpbb_notifications->mark_notifications_read('notification.type.quote', $topic_data['post_id'], $user->data['user_id']);
0939                      $phpbb_notifications->mark_notifications_read('notification.type.topic', $topic_id, $user->data['user_id']);
0940   
0941                      if ($notify_poster)
0942                      {
0943                          $phpbb_notifications->add_notifications('notification.type.approve_topic', $topic_data);
0944                      }
0945                  }
0946              }
0947   
0948              meta_refresh(3, $redirect);
0949              $message = $user->lang[$success_msg];
0950   
0951              if ($request->is_ajax())
0952              {
0953                  $json_response = new \phpbb\json_response;
0954                  $json_response->send(array(
0955                      'MESSAGE_TITLE'        => $user->lang['INFORMATION'],
0956                      'MESSAGE_TEXT'        => $message,
0957                      'REFRESH_DATA'        => null,
0958                      'visible'            => true,
0959                  ));
0960              }
0961              $message .= '<br /><br />' . $user->lang('RETURN_PAGE', '<a href="' . $redirect . '">', '</a>');
0962   
0963              // If approving one topic, also give links back to topic...
0964              if (sizeof($topic_info) == 1 && $topic_url)
0965              {
0966                  $message .= '<br /><br />' . $user->lang('RETURN_TOPIC', '<a href="' . $topic_url . '">', '</a>');
0967              }
0968              trigger_error($message);
0969          }
0970          else
0971          {
0972              $show_notify = false;
0973   
0974              if ($action == 'approve')
0975              {
0976                  foreach ($topic_info as $topic_data)
0977                  {
0978                      if ($topic_data['topic_poster'] == ANONYMOUS)
0979                      {
0980                          continue;
0981                      }
0982                      else
0983                      {
0984                          $show_notify = true;
0985                          break;
0986                      }
0987                  }
0988              }
0989   
0990              $template->assign_vars(array(
0991                  'S_NOTIFY_POSTER'            => $show_notify,
0992                  'S_' . strtoupper($action)    => true,
0993              ));
0994   
0995              confirm_box(false, strtoupper($action) . '_TOPIC' . ((sizeof($topic_id_list) == 1) ? '' : 'S'), $s_hidden_fields, 'mcp_approve.html');
0996          }
0997   
0998          redirect($redirect);
0999      }
1000   
1001      /**
1002      * Disapprove Post
1003      *
1004      * @param $post_id_list    array    IDs of the posts to disapprove/delete
1005      * @param $id            mixed    Category of the current active module
1006      * @param $mode            string    Active module
1007      * @return null
1008      */
1009      static public function disapprove_posts($post_id_list, $id, $mode)
1010      {
1011          global $db, $template, $user, $config, $phpbb_container;
1012          global $phpEx, $phpbb_root_path, $request;
1013   
1014          if (!phpbb_check_ids($post_id_list, POSTS_TABLE, 'post_id', array('m_approve')))
1015          {
1016              trigger_error('NOT_AUTHORISED');
1017          }
1018   
1019          $redirect = $request->variable('redirect', build_url(array('t', 'mode', 'quickmod')) . "&amp;mode=$mode");
1020          $redirect = reapply_sid($redirect);
1021          $reason = $request->variable('reason', '', true);
1022          $reason_id = $request->variable('reason_id', 0);
1023          $success_msg = $additional_msg = '';
1024   
1025          $s_hidden_fields = build_hidden_fields(array(
1026              'i'                => $id,
1027              'mode'            => $mode,
1028              'post_id_list'    => $post_id_list,
1029              'action'        => 'disapprove',
1030              'redirect'        => $redirect,
1031          ));
1032   
1033          $notify_poster = $request->is_set('notify_poster');
1034          $disapprove_reason = '';
1035   
1036          if ($reason_id)
1037          {
1038              $sql = 'SELECT reason_title, reason_description
1039                  FROM ' . REPORTS_REASONS_TABLE . "
1040                  WHERE reason_id = $reason_id";
1041              $result = $db->sql_query($sql);
1042              $row = $db->sql_fetchrow($result);
1043              $db->sql_freeresult($result);
1044   
1045              if (!$row || (!$reason && strtolower($row['reason_title']) == 'other'))
1046              {
1047                  $additional_msg = $user->lang['NO_REASON_DISAPPROVAL'];
1048   
1049                  $request->overwrite('confirm', null, \phpbb\request\request_interface::POST);
1050                  $request->overwrite('confirm_key', null, \phpbb\request\request_interface::POST);
1051                  $request->overwrite('confirm_key', null, \phpbb\request\request_interface::REQUEST);
1052              }
1053              else
1054              {
1055                  // If the reason is defined within the language file, we will use the localized version, else just use the database entry...
1056                  $disapprove_reason = (strtolower($row['reason_title']) != 'other') ? ((isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])])) ? $user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])] : $row['reason_description']) : '';
1057                  $disapprove_reason .= ($reason) ? "\n\n" . $reason : '';
1058   
1059                  if (isset($user->lang['report_reasons']['DESCRIPTION'][strtoupper($row['reason_title'])]))
1060                  {
1061                      $disapprove_reason_lang = strtoupper($row['reason_title']);
1062                  }
1063              }
1064          }
1065   
1066          $post_info = phpbb_get_post_data($post_id_list, 'm_approve');
1067   
1068          $is_disapproving = false;
1069          foreach ($post_info as $post_id => $post_data)
1070          {
1071              if ($post_data['post_visibility'] == ITEM_DELETED)
1072              {
1073                  continue;
1074              }
1075   
1076              $is_disapproving = true;
1077          }
1078   
1079          if (confirm_box(true))
1080          {
1081              $disapprove_log = $disapprove_log_topics = $disapprove_log_posts = array();
1082              $topic_posts_unapproved = $post_disapprove_list = $topic_information = array();
1083   
1084              // Build a list of posts to be disapproved and get the related topics real replies count
1085              foreach ($post_info as $post_id => $post_data)
1086              {
1087                  $post_disapprove_list[$post_id] = $post_data['topic_id'];
1088                  if (!isset($topic_posts_unapproved[$post_data['topic_id']]))
1089                  {
1090                      $topic_information[$post_data['topic_id']] = $post_data;
1091                      $topic_posts_unapproved[$post_data['topic_id']] = 0;
1092                  }
1093                  $topic_posts_unapproved[$post_data['topic_id']]++;
1094              }
1095   
1096              // Now we build the log array
1097              foreach ($post_disapprove_list as $post_id => $topic_id)
1098              {
1099                  // If the count of disapproved posts for the topic is equal
1100                  // to the number of unapproved posts in the topic, and there are no different
1101                  // posts, we disapprove the hole topic
1102                  if ($topic_information[$topic_id]['topic_posts_approved'] == 0 &&
1103                      $topic_information[$topic_id]['topic_posts_softdeleted'] == 0 &&
1104                      $topic_information[$topic_id]['topic_posts_unapproved'] == $topic_posts_unapproved[$topic_id])
1105                  {
1106                      // Don't write the log more than once for every topic
1107                      if (!isset($disapprove_log_topics[$topic_id]))
1108                      {
1109                          // Build disapproved topics log
1110                          $disapprove_log_topics[$topic_id] = array(
1111                              'type'            => 'topic',
1112                              'post_subject'    => $post_info[$post_id]['topic_title'],
1113                              'forum_id'        => $post_info[$post_id]['forum_id'],
1114                              'topic_id'        => 0, // useless to log a topic id, as it will be deleted
1115                              'post_username'    => ($post_info[$post_id]['poster_id'] == ANONYMOUS && !empty($post_info[$post_id]['post_username'])) ? $post_info[$post_id]['post_username'] : $post_info[$post_id]['username'],
1116                          );
1117                      }
1118                  }
1119                  else
1120                  {
1121                      // Build disapproved posts log
1122                      $disapprove_log_posts[] = array(
1123                          'type'            => 'post',
1124                          'post_subject'    => $post_info[$post_id]['post_subject'],
1125                          'forum_id'        => $post_info[$post_id]['forum_id'],
1126                          'topic_id'        => $post_info[$post_id]['topic_id'],
1127                          'post_username'    => ($post_info[$post_id]['poster_id'] == ANONYMOUS && !empty($post_info[$post_id]['post_username'])) ? $post_info[$post_id]['post_username'] : $post_info[$post_id]['username'],
1128                      );
1129   
1130                  }
1131              }
1132   
1133              // Get disapproved posts/topics counts separately
1134              $num_disapproved_topics = sizeof($disapprove_log_topics);
1135              $num_disapproved_posts = sizeof($disapprove_log_posts);
1136   
1137              // Build the whole log
1138              $disapprove_log = array_merge($disapprove_log_topics, $disapprove_log_posts);
1139   
1140              // Unset unneeded arrays
1141              unset($post_data, $disapprove_log_topics, $disapprove_log_posts);
1142   
1143              // Let's do the job - delete disapproved posts
1144              if (sizeof($post_disapprove_list))
1145              {
1146                  if (!function_exists('delete_posts'))
1147                  {
1148                      include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
1149                  }
1150   
1151                  // We do not check for permissions here, because the moderator allowed approval/disapproval should be allowed to delete the disapproved posts
1152                  // Note: function delete_posts triggers related forums/topics sync,
1153                  // so we don't need to call update_post_information later and to adjust real topic replies or forum topics count manually
1154                  delete_posts('post_id', array_keys($post_disapprove_list));
1155   
1156                  foreach ($disapprove_log as $log_data)
1157                  {
1158                      if ($is_disapproving)
1159                      {
1160                          $l_log_message = ($log_data['type'] == 'topic') ? 'LOG_TOPIC_DISAPPROVED' : 'LOG_POST_DISAPPROVED';
1161                          add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $disapprove_reason, $log_data['post_username']);
1162                      }
1163                      else
1164                      {
1165                          $l_log_message = ($log_data['type'] == 'topic') ? 'LOG_DELETE_TOPIC' : 'LOG_DELETE_POST';
1166                          add_log('mod', $log_data['forum_id'], $log_data['topic_id'], $l_log_message, $log_data['post_subject'], $log_data['post_username']);
1167                      }
1168                  }
1169              }
1170   
1171              $phpbb_notifications = $phpbb_container->get('notification_manager');
1172   
1173              $lang_reasons = array();
1174   
1175              foreach ($post_info as $post_id => $post_data)
1176              {
1177                  $disapprove_all_posts_in_topic = $topic_information[$topic_id]['topic_posts_approved'] == 0 &&
1178                      $topic_information[$topic_id]['topic_posts_softdeleted'] == 0 &&
1179                      $topic_information[$topic_id]['topic_posts_unapproved'] == $topic_posts_unapproved[$topic_id];
1180   
1181                  $phpbb_notifications->delete_notifications('notification.type.post_in_queue', $post_id);
1182   
1183                  // Do we disapprove the whole topic? Remove potential notifications
1184                  if ($disapprove_all_posts_in_topic)
1185                  {
1186                      $phpbb_notifications->delete_notifications('notification.type.topic_in_queue', $post_data['topic_id']);
1187                  }
1188   
1189                  // Notify Poster?
1190                  if ($notify_poster)
1191                  {
1192                      if ($post_data['poster_id'] == ANONYMOUS)
1193                      {
1194                          continue;
1195                      }
1196   
1197                      $post_data['disapprove_reason'] = '';
1198                      if (isset($disapprove_reason_lang))
1199                      {
1200                          // Okay we need to get the reason from the posters language
1201                          if (!isset($lang_reasons[$post_data['user_lang']]))
1202                          {
1203                              // Assign the current users translation as the default, this is not ideal but getting the board default adds another layer of complexity.
1204                              $lang_reasons[$post_data['user_lang']] = $user->lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang];
1205   
1206                              // Only load up the language pack if the language is different to the current one
1207                              if ($post_data['user_lang'] != $user->lang_name && file_exists($phpbb_root_path . '/language/' . $post_data['user_lang'] . '/mcp.' . $phpEx))
1208                              {
1209                                  // Load up the language pack
1210                                  $lang = array();
1211                                  @include($phpbb_root_path . '/language/' . basename($post_data['user_lang']) . '/mcp.' . $phpEx);
1212   
1213                                  // If we find the reason in this language pack use it
1214                                  if (isset($lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang]))
1215                                  {
1216                                      $lang_reasons[$post_data['user_lang']] = $lang['report_reasons']['DESCRIPTION'][$disapprove_reason_lang];
1217                                  }
1218   
1219                                  unset($lang); // Free memory
1220                              }
1221                          }
1222   
1223                          $post_data['disapprove_reason'] = $lang_reasons[$post_data['user_lang']];
1224                          $post_data['disapprove_reason'] .= ($reason) ? "\n\n" . $reason : '';
1225                      }
1226   
1227                      if ($disapprove_all_posts_in_topic && $topic_information[$topic_id]['topic_posts_unapproved'] == 1)
1228                      {
1229                          // If there is only 1 post when disapproving the topic,
1230                          // we send the user a "disapprove topic" notification...
1231                          $phpbb_notifications->add_notifications('notification.type.disapprove_topic', $post_data);
1232                      }
1233                      else
1234                      {
1235                          // ... otherwise there are multiple unapproved posts and
1236                          // all of them are disapproved as posts.
1237                          $phpbb_notifications->add_notifications('notification.type.disapprove_post', $post_data);
1238                      }
1239                  }
1240              }
1241   
1242              unset($lang_reasons, $post_info, $disapprove_reason, $disapprove_reason_lang);
1243   
1244              if ($num_disapproved_topics)
1245              {
1246                  $success_msg = ($num_disapproved_topics == 1) ? 'TOPIC' : 'TOPICS';
1247              }
1248              else
1249              {
1250                  $success_msg = ($num_disapproved_posts == 1) ? 'POST' : 'POSTS';
1251              }
1252   
1253              if ($is_disapproving)
1254              {
1255                  $success_msg .= '_DISAPPROVED_SUCCESS';
1256              }
1257              else
1258              {
1259                  $success_msg .= '_DELETED_SUCCESS';
1260              }
1261   
1262              // If we came from viewtopic, we try to go back to it.
1263              if (strpos($redirect, $phpbb_root_path . 'viewtopic.' . $phpEx) === 0)
1264              {
1265                  if ($num_disapproved_topics == 0)
1266                  {
1267                      // So we need to remove the post id part from the Url
1268                      $redirect = str_replace("&amp;p={$post_id_list[0]}#p{$post_id_list[0]}", '', $redirect);
1269                  }
1270                  else
1271                  {
1272                      // However this is only possible if the topic still exists,
1273                      // Otherwise we go back to the viewforum page
1274                      $redirect = append_sid($phpbb_root_path . 'viewforum.' . $phpEx, 'f=' . $request->variable('f', 0));
1275                  }
1276              }
1277   
1278              meta_refresh(3, $redirect);
1279              $message = $user->lang[$success_msg];
1280   
1281              if ($request->is_ajax())
1282              {
1283                  $json_response = new \phpbb\json_response;
1284                  $json_response->send(array(
1285                      'MESSAGE_TITLE'        => $user->lang['INFORMATION'],
1286                      'MESSAGE_TEXT'        => $message,
1287                      'REFRESH_DATA'        => null,
1288                      'visible'            => false,
1289                  ));
1290              }
1291              $message .= '<br /><br />' . $user->lang('RETURN_PAGE', '<a href="' . $redirect . '">', '</a>');
1292              trigger_error($message);
1293          }
1294          else
1295          {
1296              if (!function_exists('display_reasons'))
1297              {
1298                  include($phpbb_root_path . 'includes/functions_display.' . $phpEx);
1299              }
1300   
1301              $show_notify = false;
1302   
1303              foreach ($post_info as $post_data)
1304              {
1305                  if ($post_data['poster_id'] == ANONYMOUS)
1306                  {
1307                      continue;
1308                  }
1309                  else
1310                  {
1311                      $show_notify = true;
1312                      break;
1313                  }
1314              }
1315   
1316              $l_confirm_msg = 'DISAPPROVE_POST';
1317              $confirm_template = 'mcp_approve.html';
1318              if ($is_disapproving)
1319              {
1320                  display_reasons($reason_id);
1321              }
1322              else
1323              {
1324                  $user->add_lang('posting');
1325   
1326                  $l_confirm_msg = 'DELETE_POST_PERMANENTLY';
1327                  $confirm_template = 'confirm_delete_body.html';
1328              }
1329              $l_confirm_msg .= ((sizeof($post_id_list) == 1) ? '' : 'S');
1330   
1331              $template->assign_vars(array(
1332                  'S_NOTIFY_POSTER'    => $show_notify,
1333                  'S_APPROVE'            => false,
1334                  'REASON'            => ($is_disapproving) ? $reason : '',
1335                  'ADDITIONAL_MSG'    => $additional_msg,
1336              ));
1337   
1338              confirm_box(false, $l_confirm_msg, $s_hidden_fields, $confirm_template);
1339          }
1340   
1341          redirect($redirect);
1342      }
1343  }
1344