Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

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