Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

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

functions_mcp.php

Zuletzt modifiziert: 09.10.2024, 12:51 - Dateigröße: 20.96 KiB


 001  <?php
 002  /**
 003  *
 004  * This file is part of the phpBB Forum Software package.
 005  *
 006  * @copyright (c) phpBB Limited <https://www.phpbb.com>
 007  * @license GNU General Public License, version 2 (GPL-2.0)
 008  *
 009  * For full copyright and license information, please see
 010  * the docs/CREDITS.txt file.
 011  *
 012  */
 013   
 014  /**
 015  * @ignore
 016  */
 017  if (!defined('IN_PHPBB'))
 018  {
 019      exit;
 020  }
 021   
 022  /**
 023  * Functions used to generate additional URL paramters
 024  */
 025  function phpbb_module__url($mode, &$module_row)
 026  {
 027      return phpbb_extra_url();
 028  }
 029   
 030  function phpbb_module_notes_url($mode, &$module_row)
 031  {
 032      if ($mode == 'front')
 033      {
 034          return '';
 035      }
 036   
 037      global $user_id;
 038      return ($user_id) ? "&amp;u=$user_id" : '';
 039  }
 040   
 041  function phpbb_module_warn_url($mode, &$module_row)
 042  {
 043      if ($mode == 'front' || $mode == 'list')
 044      {
 045          global $forum_id;
 046   
 047          return ($forum_id) ? "&amp;f=$forum_id" : '';
 048      }
 049   
 050      if ($mode == 'warn_post')
 051      {
 052          global $forum_id, $post_id;
 053   
 054          $url_extra = ($forum_id) ? "&amp;f=$forum_id" : '';
 055          $url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
 056   
 057          return $url_extra;
 058      }
 059      else
 060      {
 061          global $user_id;
 062   
 063          return ($user_id) ? "&amp;u=$user_id" : '';
 064      }
 065  }
 066   
 067  function phpbb_module_main_url($mode, &$module_row)
 068  {
 069      return phpbb_extra_url();
 070  }
 071   
 072  function phpbb_module_logs_url($mode, &$module_row)
 073  {
 074      return phpbb_extra_url();
 075  }
 076   
 077  function phpbb_module_ban_url($mode, &$module_row)
 078  {
 079      return phpbb_extra_url();
 080  }
 081   
 082  function phpbb_module_queue_url($mode, &$module_row)
 083  {
 084      return phpbb_extra_url();
 085  }
 086   
 087  function phpbb_module_reports_url($mode, &$module_row)
 088  {
 089      return phpbb_extra_url();
 090  }
 091   
 092  function phpbb_extra_url()
 093  {
 094      global $forum_id, $topic_id, $post_id, $report_id, $user_id;
 095   
 096      $url_extra = '';
 097      $url_extra .= ($forum_id) ? "&amp;f=$forum_id" : '';
 098      $url_extra .= ($topic_id) ? "&amp;t=$topic_id" : '';
 099      $url_extra .= ($post_id) ? "&amp;p=$post_id" : '';
 100      $url_extra .= ($user_id) ? "&amp;u=$user_id" : '';
 101      $url_extra .= ($report_id) ? "&amp;r=$report_id" : '';
 102   
 103      return $url_extra;
 104  }
 105   
 106  /**
 107  * Get simple topic data
 108  */
 109  function phpbb_get_topic_data($topic_ids, $acl_list = false, $read_tracking = false)
 110  {
 111      global $auth, $db, $config, $user;
 112      static $rowset = array();
 113   
 114      $topics = array();
 115   
 116      if (!sizeof($topic_ids))
 117      {
 118          return array();
 119      }
 120   
 121      // cache might not contain read tracking info, so we can't use it if read
 122      // tracking information is requested
 123      if (!$read_tracking)
 124      {
 125          $cache_topic_ids = array_intersect($topic_ids, array_keys($rowset));
 126          $topic_ids = array_diff($topic_ids, array_keys($rowset));
 127      }
 128      else
 129      {
 130          $cache_topic_ids = array();
 131      }
 132   
 133      if (sizeof($topic_ids))
 134      {
 135          $sql_array = array(
 136              'SELECT'    => 't.*, f.*',
 137   
 138              'FROM'        => array(
 139                  TOPICS_TABLE    => 't',
 140              ),
 141   
 142              'LEFT_JOIN'    => array(
 143                  array(
 144                      'FROM'    => array(FORUMS_TABLE => 'f'),
 145                      'ON'    => 'f.forum_id = t.forum_id'
 146                  )
 147              ),
 148   
 149              'WHERE'        => $db->sql_in_set('t.topic_id', $topic_ids)
 150          );
 151   
 152          if ($read_tracking && $config['load_db_lastread'])
 153          {
 154              $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
 155   
 156              $sql_array['LEFT_JOIN'][] = array(
 157                  'FROM'    => array(TOPICS_TRACK_TABLE => 'tt'),
 158                  'ON'    => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
 159              );
 160   
 161              $sql_array['LEFT_JOIN'][] = array(
 162                  'FROM'    => array(FORUMS_TRACK_TABLE => 'ft'),
 163                  'ON'    => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
 164              );
 165          }
 166   
 167          $sql = $db->sql_build_query('SELECT', $sql_array);
 168          $result = $db->sql_query($sql);
 169   
 170          while ($row = $db->sql_fetchrow($result))
 171          {
 172              $rowset[$row['topic_id']] = $row;
 173   
 174              if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
 175              {
 176                  continue;
 177              }
 178   
 179              $topics[$row['topic_id']] = $row;
 180          }
 181          $db->sql_freeresult($result);
 182      }
 183   
 184      foreach ($cache_topic_ids as $id)
 185      {
 186          if (!$acl_list || $auth->acl_gets($acl_list, $rowset[$id]['forum_id']))
 187          {
 188              $topics[$id] = $rowset[$id];
 189          }
 190      }
 191   
 192      return $topics;
 193  }
 194   
 195  /**
 196  * Get simple post data
 197  */
 198  function phpbb_get_post_data($post_ids, $acl_list = false, $read_tracking = false)
 199  {
 200      global $db, $auth, $config, $user;
 201   
 202      $rowset = array();
 203   
 204      if (!sizeof($post_ids))
 205      {
 206          return array();
 207      }
 208   
 209      $sql_array = array(
 210          'SELECT'    => 'p.*, u.*, t.*, f.*',
 211   
 212          'FROM'        => array(
 213              USERS_TABLE        => 'u',
 214              POSTS_TABLE        => 'p',
 215              TOPICS_TABLE    => 't',
 216          ),
 217   
 218          'LEFT_JOIN'    => array(
 219              array(
 220                  'FROM'    => array(FORUMS_TABLE => 'f'),
 221                  'ON'    => 'f.forum_id = t.forum_id'
 222              )
 223          ),
 224   
 225          'WHERE'        => $db->sql_in_set('p.post_id', $post_ids) . '
 226              AND u.user_id = p.poster_id
 227              AND t.topic_id = p.topic_id',
 228      );
 229   
 230      if ($read_tracking && $config['load_db_lastread'])
 231      {
 232          $sql_array['SELECT'] .= ', tt.mark_time, ft.mark_time as forum_mark_time';
 233   
 234          $sql_array['LEFT_JOIN'][] = array(
 235              'FROM'    => array(TOPICS_TRACK_TABLE => 'tt'),
 236              'ON'    => 'tt.user_id = ' . $user->data['user_id'] . ' AND t.topic_id = tt.topic_id'
 237          );
 238   
 239          $sql_array['LEFT_JOIN'][] = array(
 240              'FROM'    => array(FORUMS_TRACK_TABLE => 'ft'),
 241              'ON'    => 'ft.user_id = ' . $user->data['user_id'] . ' AND t.forum_id = ft.forum_id'
 242          );
 243      }
 244   
 245      $sql = $db->sql_build_query('SELECT', $sql_array);
 246      $result = $db->sql_query($sql);
 247      unset($sql_array);
 248   
 249      while ($row = $db->sql_fetchrow($result))
 250      {
 251          if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
 252          {
 253              continue;
 254          }
 255   
 256          if ($row['post_visibility'] != ITEM_APPROVED && !$auth->acl_get('m_approve', $row['forum_id']))
 257          {
 258              // Moderators without the permission to approve post should at least not see them. ;)
 259              continue;
 260          }
 261   
 262          $rowset[$row['post_id']] = $row;
 263      }
 264      $db->sql_freeresult($result);
 265   
 266      return $rowset;
 267  }
 268   
 269  /**
 270  * Get simple forum data
 271  */
 272  function phpbb_get_forum_data($forum_id, $acl_list = 'f_list', $read_tracking = false)
 273  {
 274      global $auth, $db, $user, $config, $phpbb_container;
 275   
 276      $rowset = array();
 277   
 278      if (!is_array($forum_id))
 279      {
 280          $forum_id = array($forum_id);
 281      }
 282   
 283      if (!sizeof($forum_id))
 284      {
 285          return array();
 286      }
 287   
 288      if ($read_tracking && $config['load_db_lastread'])
 289      {
 290          $read_tracking_join = ' LEFT JOIN ' . FORUMS_TRACK_TABLE . ' ft ON (ft.user_id = ' . $user->data['user_id'] . '
 291              AND ft.forum_id = f.forum_id)';
 292          $read_tracking_select = ', ft.mark_time';
 293      }
 294      else
 295      {
 296          $read_tracking_join = $read_tracking_select = '';
 297      }
 298   
 299      $sql = "SELECT f.* $read_tracking_select
 300          FROM " . FORUMS_TABLE . " f$read_tracking_join
 301          WHERE " . $db->sql_in_set('f.forum_id', $forum_id);
 302      $result = $db->sql_query($sql);
 303   
 304      /* @var $phpbb_content_visibility \phpbb\content_visibility */
 305      $phpbb_content_visibility = $phpbb_container->get('content.visibility');
 306   
 307      while ($row = $db->sql_fetchrow($result))
 308      {
 309          if ($acl_list && !$auth->acl_gets($acl_list, $row['forum_id']))
 310          {
 311              continue;
 312          }
 313   
 314          $row['forum_topics_approved'] = $phpbb_content_visibility->get_count('forum_topics', $row, $row['forum_id']);
 315   
 316          $rowset[$row['forum_id']] = $row;
 317      }
 318      $db->sql_freeresult($result);
 319   
 320      return $rowset;
 321  }
 322   
 323  /**
 324  * Get simple pm data
 325  */
 326  function phpbb_get_pm_data($pm_ids)
 327  {
 328      global $db;
 329   
 330      $rowset = array();
 331   
 332      if (!sizeof($pm_ids))
 333      {
 334          return array();
 335      }
 336   
 337      $sql_array = array(
 338          'SELECT'    => 'p.*, u.*',
 339   
 340          'FROM'        => array(
 341              USERS_TABLE            => 'u',
 342              PRIVMSGS_TABLE        => 'p',
 343          ),
 344   
 345          'WHERE'        => $db->sql_in_set('p.msg_id', $pm_ids) . '
 346              AND u.user_id = p.author_id',
 347      );
 348   
 349      $sql = $db->sql_build_query('SELECT', $sql_array);
 350      $result = $db->sql_query($sql);
 351      unset($sql_array);
 352   
 353      while ($row = $db->sql_fetchrow($result))
 354      {
 355          $rowset[$row['msg_id']] = $row;
 356      }
 357      $db->sql_freeresult($result);
 358   
 359      return $rowset;
 360  }
 361   
 362  /**
 363  * sorting in mcp
 364  *
 365  * @param string $where_sql should either be WHERE (default if ommited) or end with AND or OR
 366  *
 367  * $mode reports and reports_closed: the $where parameters uses aliases p for posts table and r for report table
 368  * $mode unapproved_posts: the $where parameters uses aliases p for posts table and t for topic table
 369  */
 370  function phpbb_mcp_sorting($mode, &$sort_days_val, &$sort_key_val, &$sort_dir_val, &$sort_by_sql_ary, &$sort_order_sql, &$total_val, $forum_id = 0, $topic_id = 0, $where_sql = 'WHERE')
 371  {
 372      global $db, $user, $auth, $template, $request, $phpbb_dispatcher;
 373   
 374      $sort_days_val = $request->variable('st', 0);
 375      $min_time = ($sort_days_val) ? time() - ($sort_days_val * 86400) : 0;
 376   
 377      switch ($mode)
 378      {
 379          case 'viewforum':
 380              $type = 'topics';
 381              $default_key = 't';
 382              $default_dir = 'd';
 383   
 384              $sql = 'SELECT COUNT(topic_id) AS total
 385                  FROM ' . TOPICS_TABLE . "
 386                  $where_sql forum_id = $forum_id
 387                      AND topic_type NOT IN (" . POST_ANNOUNCE . ', ' . POST_GLOBAL . ")
 388                      AND topic_last_post_time >= $min_time";
 389   
 390              if (!$auth->acl_get('m_approve', $forum_id))
 391              {
 392                  $sql .= ' AND topic_visibility = ' . ITEM_APPROVED;
 393              }
 394              break;
 395   
 396          case 'viewtopic':
 397              $type = 'posts';
 398              $default_key = 't';
 399              $default_dir = 'a';
 400   
 401              $sql = 'SELECT COUNT(post_id) AS total
 402                  FROM ' . POSTS_TABLE . "
 403                  $where_sql topic_id = $topic_id
 404                      AND post_time >= $min_time";
 405   
 406              if (!$auth->acl_get('m_approve', $forum_id))
 407              {
 408                  $sql .= ' AND post_visibility = ' . ITEM_APPROVED;
 409              }
 410              break;
 411   
 412          case 'unapproved_posts':
 413          case 'deleted_posts':
 414              $visibility_const = ($mode == 'unapproved_posts') ? array(ITEM_UNAPPROVED, ITEM_REAPPROVE) : ITEM_DELETED;
 415              $type = 'posts';
 416              $default_key = 't';
 417              $default_dir = 'd';
 418              $where_sql .= ($topic_id) ? ' p.topic_id = ' . $topic_id . ' AND' : '';
 419   
 420              $sql = 'SELECT COUNT(p.post_id) AS total
 421                  FROM ' . POSTS_TABLE . ' p, ' . TOPICS_TABLE . " t
 422                  $where_sql " . $db->sql_in_set('p.forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_approve'))) . '
 423                      AND ' . $db->sql_in_set('p.post_visibility', $visibility_const) .'
 424                      AND t.topic_id = p.topic_id
 425                      AND t.topic_visibility <> p.post_visibility';
 426   
 427              if ($min_time)
 428              {
 429                  $sql .= ' AND post_time >= ' . $min_time;
 430              }
 431              break;
 432   
 433          case 'unapproved_topics':
 434          case 'deleted_topics':
 435              $visibility_const = ($mode == 'unapproved_topics') ? array(ITEM_UNAPPROVED, ITEM_REAPPROVE) : ITEM_DELETED;
 436              $type = 'topics';
 437              $default_key = 't';
 438              $default_dir = 'd';
 439   
 440              $sql = 'SELECT COUNT(topic_id) AS total
 441                  FROM ' . TOPICS_TABLE . "
 442                  $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_approve'))) . '
 443                      AND ' . $db->sql_in_set('topic_visibility', $visibility_const);
 444   
 445              if ($min_time)
 446              {
 447                  $sql .= ' AND topic_time >= ' . $min_time;
 448              }
 449              break;
 450   
 451          case 'pm_reports':
 452          case 'pm_reports_closed':
 453          case 'reports':
 454          case 'reports_closed':
 455              $pm = (strpos($mode, 'pm_') === 0) ? true : false;
 456   
 457              $type = ($pm) ? 'pm_reports' : 'reports';
 458              $default_key = 't';
 459              $default_dir = 'd';
 460              $limit_time_sql = ($min_time) ? "AND r.report_time >= $min_time" : '';
 461   
 462              if ($topic_id)
 463              {
 464                  $where_sql .= ' p.topic_id = ' . $topic_id . ' AND ';
 465              }
 466              else if ($forum_id)
 467              {
 468                  $where_sql .= ' p.forum_id = ' . $forum_id . ' AND ';
 469              }
 470              else if (!$pm)
 471              {
 472                  $where_sql .= ' ' . $db->sql_in_set('p.forum_id', get_forum_list(array('!f_read', '!m_report')), true, true) . ' AND ';
 473              }
 474   
 475              if ($mode == 'reports' || $mode == 'pm_reports')
 476              {
 477                  $where_sql .= ' r.report_closed = 0 AND ';
 478              }
 479              else
 480              {
 481                  $where_sql .= ' r.report_closed = 1 AND ';
 482              }
 483   
 484              if ($pm)
 485              {
 486                  $sql = 'SELECT COUNT(r.report_id) AS total
 487                      FROM ' . REPORTS_TABLE . ' r, ' . PRIVMSGS_TABLE . " p
 488                      $where_sql r.post_id = 0
 489                          AND p.msg_id = r.pm_id
 490                          $limit_time_sql";
 491              }
 492              else
 493              {
 494                  $sql = 'SELECT COUNT(r.report_id) AS total
 495                      FROM ' . REPORTS_TABLE . ' r, ' . POSTS_TABLE . " p
 496                      $where_sql r.pm_id = 0
 497                          AND p.post_id = r.post_id
 498                          $limit_time_sql";
 499              }
 500              break;
 501   
 502          case 'viewlogs':
 503              $type = 'logs';
 504              $default_key = 't';
 505              $default_dir = 'd';
 506   
 507              $sql = 'SELECT COUNT(log_id) AS total
 508                  FROM ' . LOG_TABLE . "
 509                  $where_sql " . $db->sql_in_set('forum_id', ($forum_id) ? array($forum_id) : array_intersect(get_forum_list('f_read'), get_forum_list('m_'))) . '
 510                      AND log_time >= ' . $min_time . '
 511                      AND log_type = ' . LOG_MOD;
 512              break;
 513      }
 514   
 515      $sort_key_val = $request->variable('sk', $default_key);
 516      $sort_dir_val = $request->variable('sd', $default_dir);
 517      $sort_dir_text = array('a' => $user->lang['ASCENDING'], 'd' => $user->lang['DESCENDING']);
 518   
 519      switch ($type)
 520      {
 521          case 'topics':
 522              $limit_days = array(0 => $user->lang['ALL_TOPICS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 523              $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 'tt' => $user->lang['TOPIC_TIME'], 'r' => $user->lang['REPLIES'], 's' => $user->lang['SUBJECT'], 'v' => $user->lang['VIEWS']);
 524   
 525              $sort_by_sql_ary = array('a' => 't.topic_first_poster_name', 't' => array('t.topic_last_post_time', 't.topic_last_post_id'), 'tt' => 't.topic_time', 'r' => (($auth->acl_get('m_approve', $forum_id)) ? 't.topic_posts_approved + t.topic_posts_unapproved + t.topic_posts_softdeleted' : 't.topic_posts_approved'), 's' => 't.topic_title', 'v' => 't.topic_views');
 526              $limit_time_sql = ($min_time) ? "AND t.topic_last_post_time >= $min_time" : '';
 527              break;
 528   
 529          case 'posts':
 530              $limit_days = array(0 => $user->lang['ALL_POSTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 531              $sort_by_text = array('a' => $user->lang['AUTHOR'], 't' => $user->lang['POST_TIME'], 's' => $user->lang['SUBJECT']);
 532              $sort_by_sql_ary = array('a' => 'u.username_clean', 't' => array('p.post_time', 'p.post_id'), 's' => 'p.post_subject');
 533              $limit_time_sql = ($min_time) ? "AND p.post_time >= $min_time" : '';
 534              break;
 535   
 536          case 'reports':
 537              $limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 538              $sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
 539              $sort_by_sql_ary = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => array('p.post_time', 'p.post_id'), 't' => 'r.report_time', 's' => 'p.post_subject');
 540              break;
 541   
 542          case 'pm_reports':
 543              $limit_days = array(0 => $user->lang['ALL_REPORTS'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 544              $sort_by_text = array('a' => $user->lang['AUTHOR'], 'r' => $user->lang['REPORTER'], 'p' => $user->lang['POST_TIME'], 't' => $user->lang['REPORT_TIME'], 's' => $user->lang['SUBJECT']);
 545              $sort_by_sql_ary = array('a' => 'u.username_clean', 'r' => 'ru.username', 'p' => 'p.message_time', 't' => 'r.report_time', 's' => 'p.message_subject');
 546              break;
 547   
 548          case 'logs':
 549              $limit_days = array(0 => $user->lang['ALL_ENTRIES'], 1 => $user->lang['1_DAY'], 7 => $user->lang['7_DAYS'], 14 => $user->lang['2_WEEKS'], 30 => $user->lang['1_MONTH'], 90 => $user->lang['3_MONTHS'], 180 => $user->lang['6_MONTHS'], 365 => $user->lang['1_YEAR']);
 550              $sort_by_text = array('u' => $user->lang['SORT_USERNAME'], 't' => $user->lang['SORT_DATE'], 'i' => $user->lang['SORT_IP'], 'o' => $user->lang['SORT_ACTION']);
 551   
 552              $sort_by_sql_ary = array('u' => 'u.username_clean', 't' => 'l.log_time', 'i' => 'l.log_ip', 'o' => 'l.log_operation');
 553              $limit_time_sql = ($min_time) ? "AND l.log_time >= $min_time" : '';
 554              break;
 555      }
 556   
 557      // Default total to -1 to allow editing by the event
 558      $total_val = -1;
 559   
 560      $sort_by_sql = $sort_by_sql_ary;
 561      $sort_days = $sort_days_val;
 562      $sort_dir = $sort_dir_val;
 563      $sort_key = $sort_key_val;
 564      $total = $total_val;
 565      /**
 566      * This event allows you to control the SQL query used to get the total number
 567      * of reports the user can access.
 568      *
 569      * This total is used for the pagination and for displaying the total number
 570      * of reports to the user
 571      *
 572      *
 573      * @event core.mcp_sorting_query_before
 574      * @var    string    sql                    The current SQL search string
 575      * @var    string    mode                An id related to the module(s) the user is viewing
 576      * @var    string    type                Which kind of information is this being used for displaying. Posts, topics, etc...
 577      * @var    int        forum_id            The forum id of the posts the user is trying to access, if not 0
 578      * @var    int        topic_id            The topic id of the posts the user is trying to access, if not 0
 579      * @var    int        sort_days            The max age of the oldest report to be shown, in days
 580      * @var    string    sort_key            The way the user has decided to sort the data.
 581      *                                    The valid values must be in the keys of the sort_by_* variables
 582      * @var    string    sort_dir            Either 'd' for "DESC" or 'a' for 'ASC' in the SQL query
 583      * @var    int        limit_days            The possible max ages of the oldest report for the user to choose, in days.
 584      * @var    array    sort_by_sql            SQL text (values) for the possible names of the ways of sorting data (keys).
 585      * @var    array    sort_by_text        Language text (values) for the possible names of the ways of sorting data (keys).
 586      * @var    int        min_time            Integer with the minimum post time that the user is searching for
 587      * @var    int        limit_time_sql        Time limiting options used in the SQL query.
 588      * @var    int        total                The total number of reports that exist. Only set if you want to override the result
 589      * @var    string    where_sql            Extra information included in the WHERE clause. It must end with "WHERE" or "AND" or "OR".
 590      *                                    Set to "WHERE" and set total above -1 to override the total value
 591      * @since 3.1.4-RC1
 592      */
 593      $vars = array(
 594          'sql',
 595          'mode',
 596          'type',
 597          'forum_id',
 598          'topic_id',
 599          'sort_days',
 600          'sort_key',
 601          'sort_dir',
 602          'limit_days',
 603          'sort_by_sql',
 604          'sort_by_text',
 605          'min_time',
 606          'limit_time_sql',
 607          'total',
 608          'where_sql',
 609      );
 610      extract($phpbb_dispatcher->trigger_event('core.mcp_sorting_query_before', compact($vars)));
 611      $sort_by_sql_ary = $sort_by_sql;
 612      $sort_days_val = $sort_days;
 613      $sort_key_val = $sort_key;
 614      $sort_dir_val = $sort_dir;
 615      $total_val = $total;
 616      unset($sort_by_sql);
 617      unset($sort_days);
 618      unset($sort_key);
 619      unset($sort_dir);
 620      unset($total);
 621   
 622      if (!isset($sort_by_sql_ary[$sort_key_val]))
 623      {
 624          $sort_key_val = $default_key;
 625      }
 626   
 627      $direction = ($sort_dir_val == 'd') ? 'DESC' : 'ASC';
 628   
 629      if (is_array($sort_by_sql_ary[$sort_key_val]))
 630      {
 631          $sort_order_sql = implode(' ' . $direction . ', ', $sort_by_sql_ary[$sort_key_val]) . ' ' . $direction;
 632      }
 633      else
 634      {
 635          $sort_order_sql = $sort_by_sql_ary[$sort_key_val] . ' ' . $direction;
 636      }
 637   
 638      $s_limit_days = $s_sort_key = $s_sort_dir = $sort_url = '';
 639      gen_sort_selects($limit_days, $sort_by_text, $sort_days_val, $sort_key_val, $sort_dir_val, $s_limit_days, $s_sort_key, $s_sort_dir, $sort_url);
 640   
 641      $template->assign_vars(array(
 642              'S_SELECT_SORT_DIR'        => $s_sort_dir,
 643              'S_SELECT_SORT_KEY'        => $s_sort_key,
 644              'S_SELECT_SORT_DAYS'    => $s_limit_days)
 645      );
 646   
 647      if (($sort_days_val && $mode != 'viewlogs') || in_array($mode, array('reports', 'unapproved_topics', 'unapproved_posts', 'deleted_topics', 'deleted_posts')) || $where_sql != 'WHERE')
 648      {
 649          $result = $db->sql_query($sql);
 650          $total_val = (int) $db->sql_fetchfield('total');
 651          $db->sql_freeresult($result);
 652      }
 653      else if ($total_val < -1)
 654      {
 655          $total_val = -1;
 656      }
 657  }
 658   
 659  /**
 660  * Validate ids
 661  *
 662  * @param    array    &$ids            The relevant ids to check
 663  * @param    string    $table            The table to find the ids in
 664  * @param    string    $sql_id            The ids relevant column name
 665  * @param    array    $acl_list        A list of permissions the user need to have
 666  * @param    mixed    $singe_forum    Limit to one forum id (int) or the first forum found (true)
 667  *
 668  * @return    mixed    False if no ids were able to be retrieved, true if at least one id left.
 669  *                    Additionally, this value can be the forum_id assigned if $single_forum was set.
 670  *                    Therefore checking the result for with !== false is the best method.
 671  */
 672  function phpbb_check_ids(&$ids, $table, $sql_id, $acl_list = false, $single_forum = false)
 673  {
 674      global $db, $auth;
 675   
 676      if (!is_array($ids) || empty($ids))
 677      {
 678          return false;
 679      }
 680   
 681      $sql = "SELECT $sql_id, forum_id FROM $table
 682          WHERE " . $db->sql_in_set($sql_id, $ids);
 683      $result = $db->sql_query($sql);
 684   
 685      $ids = array();
 686      $forum_id = false;
 687   
 688      while ($row = $db->sql_fetchrow($result))
 689      {
 690          if ($acl_list && $row['forum_id'] && !$auth->acl_gets($acl_list, $row['forum_id']))
 691          {
 692              continue;
 693          }
 694   
 695          if ($acl_list && !$row['forum_id'] && !$auth->acl_getf_global($acl_list))
 696          {
 697              continue;
 698          }
 699   
 700          // Limit forum? If not, just assign the id.
 701          if ($single_forum === false)
 702          {
 703              $ids[] = $row[$sql_id];
 704              continue;
 705          }
 706   
 707          // Limit forum to a specific forum id?
 708          // This can get really tricky, because we do not want to create a failure on global topics. :)
 709          if ($row['forum_id'])
 710          {
 711              if ($single_forum !== true && $row['forum_id'] == (int) $single_forum)
 712              {
 713                  $forum_id = (int) $single_forum;
 714              }
 715              else if ($forum_id === false)
 716              {
 717                  $forum_id = $row['forum_id'];
 718              }
 719   
 720              if ($row['forum_id'] == $forum_id)
 721              {
 722                  $ids[] = $row[$sql_id];
 723              }
 724          }
 725          else
 726          {
 727              // Always add a global topic
 728              $ids[] = $row[$sql_id];
 729          }
 730      }
 731      $db->sql_freeresult($result);
 732   
 733      if (!sizeof($ids))
 734      {
 735          return false;
 736      }
 737   
 738      // If forum id is false and ids populated we may have only global announcements selected (returning 0 because of (int) $forum_id)
 739   
 740      return ($single_forum === false) ? true : (int) $forum_id;
 741  }
 742