Verzeichnisstruktur phpBB-3.0.0


Veröffentlicht
12.12.2007

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

acp_search.php

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


 001  <?php
 002  /**
 003  *
 004  * @package acp
 005  * @version $Id$
 006  * @copyright (c) 2005 phpBB Group
 007  * @license http://opensource.org/licenses/gpl-license.php GNU Public License
 008  *
 009  */
 010   
 011  /**
 012  * @ignore
 013  */
 014  if (!defined('IN_PHPBB'))
 015  {
 016      exit;
 017  }
 018   
 019  /**
 020  * @package acp
 021  */
 022  class acp_search
 023  {
 024      var $u_action;
 025      var $state;
 026      var $search;
 027      var $max_post_id;
 028      var $batch_size = 100;
 029   
 030      function main($id, $mode)
 031      {
 032          global $user;
 033   
 034          $user->add_lang('acp/search');
 035   
 036          // For some this may be of help...
 037          @ini_set('memory_limit', '128M');
 038   
 039          switch ($mode)
 040          {
 041              case 'settings':
 042                  $this->settings($id, $mode);
 043              break;
 044   
 045              case 'index':
 046                  $this->index($id, $mode);
 047              break;
 048          }
 049      }
 050   
 051      function settings($id, $mode)
 052      {
 053          global $db, $user, $auth, $template, $cache;
 054          global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
 055   
 056          $submit = (isset($_POST['submit'])) ? true : false;
 057   
 058          $search_types = $this->get_search_types();
 059   
 060          $settings = array(
 061              'search_interval'            => 'float',
 062              'search_anonymous_interval'    => 'float',
 063              'load_search'                => 'bool',
 064              'limit_search_load'            => 'float',
 065              'min_search_author_chars'    => 'integer',
 066              'search_store_results'        => 'integer',
 067          );
 068   
 069          $search = null;
 070          $error = false;
 071          $search_options = '';
 072          foreach ($search_types as $type)
 073          {
 074              if ($this->init_search($type, $search, $error))
 075              {
 076                  continue;
 077              }
 078   
 079              $name = ucfirst(strtolower(str_replace('_', ' ', $type)));
 080              $selected = ($config['search_type'] == $type) ? ' selected="selected"' : '';
 081              $search_options .= '<option value="' . $type . '"' . $selected . '>' . $name . '</option>';
 082   
 083              if (method_exists($search, 'acp'))
 084              {
 085                  $vars = $search->acp();
 086   
 087                  if (!$submit)
 088                  {
 089                      $template->assign_block_vars('backend', array(
 090                          'NAME'        => $name,
 091                          'SETTINGS'    => $vars['tpl'])
 092                      );
 093                  }
 094                  else if (is_array($vars['config']))
 095                  {
 096                      $settings = array_merge($settings, $vars['config']);
 097                  }
 098              }
 099          }
 100          unset($search);
 101          unset($error);
 102   
 103          $cfg_array = (isset($_REQUEST['config'])) ? request_var('config', array('' => ''), true) : array();
 104          $updated = request_var('updated', false);
 105   
 106          foreach ($settings as $config_name => $var_type)
 107          {
 108              if (!isset($cfg_array[$config_name]))
 109              {
 110                  continue;
 111              }
 112   
 113              // e.g. integer:4:12 (min 4, max 12)
 114              $var_type = explode(':', $var_type);
 115   
 116              $config_value = $cfg_array[$config_name];
 117              settype($config_value, $var_type[0]);
 118   
 119              if (isset($var_type[1]))
 120              {
 121                  $config_value = max($var_type[1], $config_value);
 122              }
 123   
 124              if (isset($var_type[2]))
 125              {
 126                  $config_value = min($var_type[2], $config_value);
 127              }
 128   
 129              // only change config if anything was actually changed
 130              if ($submit && ($config[$config_name] != $config_value))
 131              {
 132                  set_config($config_name, $config_value);
 133                  $updated = true;
 134              }
 135          }
 136   
 137          if ($submit)
 138          {
 139              $extra_message = '';
 140              if ($updated)
 141              {
 142                  add_log('admin', 'LOG_CONFIG_SEARCH');
 143              }
 144   
 145              if (isset($cfg_array['search_type']) && in_array($cfg_array['search_type'], $search_types, true) && ($cfg_array['search_type'] != $config['search_type']))
 146              {
 147                  $search = null;
 148                  $error = false;
 149   
 150                  if (!$this->init_search($cfg_array['search_type'], $search, $error))
 151                  {
 152                      if (confirm_box(true))
 153                      {
 154                          if (!method_exists($search, 'init') || !($error = $search->init()))
 155                          {
 156                              set_config('search_type', $cfg_array['search_type']);
 157   
 158                              if (!$updated)
 159                              {
 160                                  add_log('admin', 'LOG_CONFIG_SEARCH');
 161                              }
 162                              $extra_message = '<br />' . $user->lang['SWITCHED_SEARCH_BACKEND'] . '<br /><a href="' . append_sid("{$phpbb_admin_path}index.$phpEx", 'i=search&amp;mode=index') . '">&raquo; ' . $user->lang['GO_TO_SEARCH_INDEX'] . '</a>';
 163                          }
 164                          else
 165                          {
 166                              trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);
 167                          }
 168                      }
 169                      else
 170                      {
 171                          confirm_box(false, $user->lang['CONFIRM_SEARCH_BACKEND'], build_hidden_fields(array(
 172                              'i'            => $id,
 173                              'mode'        => $mode,
 174                              'submit'    => true,
 175                              'updated'    => $updated,
 176                              'config'    => array('search_type' => $cfg_array['search_type']),
 177                          )));
 178                      }
 179                  }
 180                  else
 181                  {
 182                      trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);
 183                  }
 184              }
 185   
 186              trigger_error($user->lang['CONFIG_UPDATED'] . $extra_message . adm_back_link($this->u_action));
 187          }
 188          unset($cfg_array);
 189   
 190          $this->tpl_name = 'acp_search';
 191          $this->page_title = 'ACP_SEARCH_SETTINGS';
 192   
 193          $template->assign_vars(array(
 194              'LIMIT_SEARCH_LOAD'        => (float) $config['limit_search_load'],
 195              'MIN_SEARCH_AUTHOR_CHARS'    => (int) $config['min_search_author_chars'],
 196              'SEARCH_INTERVAL'        => (float) $config['search_interval'],
 197              'SEARCH_GUEST_INTERVAL'    => (float) $config['search_anonymous_interval'],
 198              'SEARCH_STORE_RESULTS'    => (int) $config['search_store_results'],
 199   
 200              'S_SEARCH_TYPES'        => $search_options,
 201              'S_YES_SEARCH'            => (bool) $config['load_search'],
 202              'S_SETTINGS'            => true,
 203   
 204              'U_ACTION'                => $this->u_action)
 205          );
 206      }
 207   
 208      function index($id, $mode)
 209      {
 210          global $db, $user, $auth, $template, $cache;
 211          global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
 212   
 213          if (isset($_REQUEST['action']) && is_array($_REQUEST['action']))
 214          {
 215              $action = request_var('action', array('' => false));
 216              $action = key($action);
 217          }
 218          else
 219          {
 220              $action = request_var('action', '');
 221          }
 222          $this->state = explode(',', $config['search_indexing_state']);
 223   
 224          if (isset($_POST['cancel']))
 225          {
 226              $action = '';
 227              $this->state = array();
 228              $this->save_state();
 229          }
 230   
 231          if ($action)
 232          {
 233              switch ($action)
 234              {
 235                  case 'progress_bar':
 236                      $type = request_var('type', '');
 237                      $this->display_progress_bar($type);
 238                  break;
 239   
 240                  case 'delete':
 241                      $this->state[1] = 'delete';
 242                  break;
 243   
 244                  case 'create':
 245                      $this->state[1] = 'create';
 246                  break;
 247   
 248                  default:
 249                      trigger_error('NO_ACTION', E_USER_ERROR);
 250                  break;
 251              }
 252   
 253              if (empty($this->state[0]))
 254              {
 255                  $this->state[0] = request_var('search_type', '');
 256              }
 257   
 258              $this->search = null;
 259              $error = false;
 260              if ($this->init_search($this->state[0], $this->search, $error))
 261              {
 262                  trigger_error($error . adm_back_link($this->u_action), E_USER_WARNING);
 263              }
 264              $name = ucfirst(strtolower(str_replace('_', ' ', $this->state[0])));
 265   
 266              $action = &$this->state[1];
 267   
 268              $this->max_post_id = $this->get_max_post_id();
 269   
 270              $post_counter = (isset($this->state[2])) ? $this->state[2] : 0;
 271              $this->state[2] = &$post_counter;
 272              $this->save_state();
 273   
 274              switch ($action)
 275              {
 276                  case 'delete':
 277                      if (method_exists($this->search, 'delete_index'))
 278                      {
 279                          // pass a reference to myself so the $search object can make use of save_state() and attributes
 280                          if ($error = $this->search->delete_index($this, append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&mode=$mode&action=delete", false)))
 281                          {
 282                              $this->state = array('');
 283                              $this->save_state();
 284                              trigger_error($error . adm_back_link($this->u_action) . $this->close_popup_js(), E_USER_WARNING);
 285                          }
 286                      }
 287                      else
 288                      {
 289                          $starttime = explode(' ', microtime());
 290                          $starttime = $starttime[1] + $starttime[0];
 291                          $row_count = 0;
 292                          while (still_on_time() && $post_counter <= $this->max_post_id)
 293                          {
 294                              $sql = 'SELECT post_id, poster_id, forum_id
 295                                  FROM ' . POSTS_TABLE . '
 296                                  WHERE post_id >= ' . (int) ($post_counter + 1) . '
 297                                      AND post_id <= ' . (int) ($post_counter + $this->batch_size);
 298                              $result = $db->sql_query($sql);
 299   
 300                              $ids = $posters = $forum_ids = array();
 301                              while ($row = $db->sql_fetchrow($result))
 302                              {
 303                                  $ids[] = $row['post_id'];
 304                                  $posters[] = $row['poster_id'];
 305                                  $forum_ids[] = $row['forum_id'];
 306                              }
 307                              $db->sql_freeresult($result);
 308                              $row_count += sizeof($ids);
 309   
 310                              if (sizeof($ids))
 311                              {
 312                                  $this->search->index_remove($ids, $posters, $forum_ids);
 313                              }
 314   
 315                              $post_counter += $this->batch_size;
 316                          }
 317                          // save the current state
 318                          $this->save_state();
 319   
 320                          if ($post_counter <= $this->max_post_id)
 321                          {
 322                              $mtime = explode(' ', microtime());
 323                              $totaltime = $mtime[0] + $mtime[1] - $starttime;
 324                              $rows_per_second = $row_count / $totaltime;
 325                              meta_refresh(1, append_sid($this->u_action . '&amp;action=delete&amp;skip_rows=' . $post_counter));
 326                              trigger_error(sprintf($user->lang['SEARCH_INDEX_DELETE_REDIRECT'], $post_counter, $row_count, $rows_per_second));
 327                          }
 328                      }
 329   
 330                      $this->search->tidy();
 331   
 332                      $this->state = array('');
 333                      $this->save_state();
 334   
 335                      add_log('admin', 'LOG_SEARCH_INDEX_REMOVED', $name);
 336                      trigger_error($user->lang['SEARCH_INDEX_REMOVED'] . adm_back_link($this->u_action) . $this->close_popup_js());
 337                  break;
 338   
 339                  case 'create':
 340                      if (method_exists($this->search, 'create_index'))
 341                      {
 342                          // pass a reference to acp_search so the $search object can make use of save_state() and attributes
 343                          if ($error = $this->search->create_index($this, append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&mode=$mode&action=create", false)))
 344                          {
 345                              $this->state = array('');
 346                              $this->save_state();
 347                              trigger_error($error . adm_back_link($this->u_action) . $this->close_popup_js(), E_USER_WARNING);
 348                          }
 349                      }
 350                      else
 351                      {
 352                          $sql = 'SELECT forum_id, enable_indexing
 353                              FROM ' . FORUMS_TABLE;
 354                          $result = $db->sql_query($sql, 3600);
 355   
 356                          while ($row = $db->sql_fetchrow($result))
 357                          {
 358                              $forums[$row['forum_id']] = (bool) $row['enable_indexing'];
 359                          }
 360                          $db->sql_freeresult($result);
 361   
 362                          $starttime = explode(' ', microtime());
 363                          $starttime = $starttime[1] + $starttime[0];
 364                          $row_count = 0;
 365                          while (still_on_time() && $post_counter <= $this->max_post_id)
 366                          {
 367                              $sql = 'SELECT post_id, post_subject, post_text, poster_id, forum_id
 368                                  FROM ' . POSTS_TABLE . '
 369                                  WHERE post_id >= ' . (int) ($post_counter + 1) . '
 370                                      AND post_id <= ' . (int) ($post_counter + $this->batch_size);
 371                              $result = $db->sql_query($sql);
 372   
 373                              while ($row = $db->sql_fetchrow($result))
 374                              {
 375                                  // Indexing enabled for this forum or global announcement?
 376                                  // Global announcements get indexed by default.
 377                                  if (!$row['forum_id'] || (isset($forums[$row['forum_id']]) && $forums[$row['forum_id']]))
 378                                  {
 379                                      $this->search->index('post', $row['post_id'], $row['post_text'], $row['post_subject'], $row['poster_id'], $row['forum_id']);
 380                                  }
 381                                  $row_count++;
 382                              }
 383                              $db->sql_freeresult($result);
 384   
 385                              $post_counter += $this->batch_size;
 386                          }
 387                          // save the current state
 388                          $this->save_state();
 389   
 390                          // pretend the number of posts was as big as the number of ids we indexed so far
 391                          // just an estimation as it includes deleted posts
 392                          $num_posts = $config['num_posts'];
 393                          $config['num_posts'] = min($config['num_posts'], $post_counter);
 394                          $this->search->tidy();
 395                          $config['num_posts'] = $num_posts;
 396   
 397                          if ($post_counter <= $this->max_post_id)
 398                          {
 399                              $mtime = explode(' ', microtime());
 400                              $totaltime = $mtime[0] + $mtime[1] - $starttime;
 401                              $rows_per_second = $row_count / $totaltime;
 402                              meta_refresh(1, append_sid($this->u_action . '&amp;action=create&amp;skip_rows=' . $post_counter));
 403                              trigger_error(sprintf($user->lang['SEARCH_INDEX_CREATE_REDIRECT'], $post_counter, $row_count, $rows_per_second));
 404                          }
 405                      }
 406   
 407                      $this->search->tidy();
 408   
 409                      $this->state = array('');
 410                      $this->save_state();
 411   
 412                      add_log('admin', 'LOG_SEARCH_INDEX_CREATED', $name);
 413                      trigger_error($user->lang['SEARCH_INDEX_CREATED'] . adm_back_link($this->u_action) . $this->close_popup_js());
 414                  break;
 415              }
 416          }
 417   
 418          $search_types = $this->get_search_types();
 419   
 420          $search = null;
 421          $error = false;
 422          $search_options = '';
 423          foreach ($search_types as $type)
 424          {
 425              if ($this->init_search($type, $search, $error) || !method_exists($search, 'index_created'))
 426              {
 427                  continue;
 428              }
 429   
 430              $name = ucfirst(strtolower(str_replace('_', ' ', $type)));
 431   
 432              $data = array();
 433              if (method_exists($search, 'index_stats'))
 434              {
 435                  $data = $search->index_stats();
 436              }
 437   
 438              $statistics = array();
 439              foreach ($data as $statistic => $value)
 440              {
 441                  $n = sizeof($statistics);
 442                  if ($n && sizeof($statistics[$n - 1]) < 3)
 443                  {
 444                      $statistics[$n - 1] += array('statistic_2' => $statistic, 'value_2' => $value);
 445                  }
 446                  else
 447                  {
 448                      $statistics[] = array('statistic_1' => $statistic, 'value_1' => $value);
 449                  }
 450              }
 451   
 452              $template->assign_block_vars('backend', array(
 453                  'L_NAME'            => $name,
 454                  'NAME'                => $type,
 455   
 456                  'S_ACTIVE'            => ($type == $config['search_type']) ? true : false,
 457                  'S_HIDDEN_FIELDS'    => build_hidden_fields(array('search_type' => $type)),
 458                  'S_INDEXED'            => (bool) $search->index_created(),
 459                  'S_STATS'            => (bool) sizeof($statistics))
 460              );
 461   
 462              foreach ($statistics as $statistic)
 463              {
 464                  $template->assign_block_vars('backend.data', array(
 465                      'STATISTIC_1'    => $statistic['statistic_1'],
 466                      'VALUE_1'        => $statistic['value_1'],
 467                      'STATISTIC_2'    => (isset($statistic['statistic_2'])) ? $statistic['statistic_2'] : '',
 468                      'VALUE_2'        => (isset($statistic['value_2'])) ? $statistic['value_2'] : '')
 469                  );
 470              }
 471          }
 472          unset($search);
 473          unset($error);
 474          unset($statistics);
 475          unset($data);
 476   
 477          $this->tpl_name = 'acp_search';
 478          $this->page_title = 'ACP_SEARCH_INDEX';
 479   
 480          $template->assign_vars(array(
 481              'S_INDEX'                => true,
 482              'U_ACTION'                => $this->u_action,
 483              'U_PROGRESS_BAR'        => append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&amp;mode=$mode&amp;action=progress_bar"),
 484              'UA_PROGRESS_BAR'        => addslashes(append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&amp;mode=$mode&amp;action=progress_bar")),
 485          ));
 486   
 487          if (isset($this->state[1]))
 488          {
 489              $template->assign_vars(array(
 490                  'S_CONTINUE_INDEXING'    => $this->state[1],
 491                  'U_CONTINUE_INDEXING'    => $this->u_action . '&amp;action=' . $this->state[1],
 492                  'L_CONTINUE'            => ($this->state[1] == 'create') ? $user->lang['CONTINUE_INDEXING'] : $user->lang['CONTINUE_DELETING_INDEX'],
 493                  'L_CONTINUE_EXPLAIN'    => ($this->state[1] == 'create') ? $user->lang['CONTINUE_INDEXING_EXPLAIN'] : $user->lang['CONTINUE_DELETING_INDEX_EXPLAIN'])
 494              );
 495          }
 496      }
 497   
 498      function display_progress_bar($type)
 499      {
 500          global $template, $user;
 501   
 502          $l_type = ($type == 'create') ? 'INDEXING_IN_PROGRESS' : 'DELETING_INDEX_IN_PROGRESS';
 503   
 504          adm_page_header($user->lang[$l_type]);
 505   
 506          $template->set_filenames(array(
 507              'body'    => 'progress_bar.html')
 508          );
 509   
 510          $template->assign_vars(array(
 511              'L_PROGRESS'            => $user->lang[$l_type],
 512              'L_PROGRESS_EXPLAIN'    => $user->lang[$l_type . '_EXPLAIN'])
 513          );
 514   
 515          adm_page_footer();
 516      }
 517   
 518      function close_popup_js()
 519      {
 520          return "<script type=\"text/javascript\">\n" .
 521              "<!--\n" .
 522              "    close_waitscreen = 1;\n" .
 523              "//-->\n" .
 524              "</script>\n";
 525      }
 526   
 527      function get_search_types()
 528      {
 529          global $phpbb_root_path, $phpEx;
 530   
 531          $search_types = array();
 532   
 533          $dp = @opendir($phpbb_root_path . 'includes/search');
 534   
 535          if ($dp)
 536          {
 537              while (($file = readdir($dp)) !== false)
 538              {
 539                  if ((preg_match('#\.' . $phpEx . '$#', $file)) && ($file != "search.$phpEx"))
 540                  {
 541                      $search_types[] = preg_replace('#^(.*?)\.' . $phpEx . '$#', '\1', $file);
 542                  }
 543              }
 544              closedir($dp);
 545   
 546              sort($search_types);
 547          }
 548   
 549          return $search_types;
 550      }
 551   
 552      function get_max_post_id()
 553      {
 554          global $db;
 555   
 556          $sql = 'SELECT MAX(post_id) as max_post_id
 557              FROM '. POSTS_TABLE;
 558          $result = $db->sql_query($sql);
 559          $max_post_id = (int) $db->sql_fetchfield('max_post_id');
 560          $db->sql_freeresult($result);
 561   
 562          return $max_post_id;
 563      }
 564   
 565      function save_state($state = false)
 566      {
 567          if ($state)
 568          {
 569              $this->state = $state;
 570          }
 571   
 572          ksort($this->state);
 573   
 574          set_config('search_indexing_state', implode(',', $this->state));
 575      }
 576   
 577      /**
 578      * Initialises a search backend object
 579      *
 580      * @return false if no error occurred else an error message
 581      */
 582      function init_search($type, &$search, &$error)
 583      {
 584          global $phpbb_root_path, $phpEx, $user;
 585   
 586          if (!preg_match('#^\w+$#', $type) || !file_exists("{$phpbb_root_path}includes/search/$type.$phpEx"))
 587          {
 588              $error = $user->lang['NO_SUCH_SEARCH_MODULE'];
 589              return $error;
 590          }
 591   
 592          include_once("{$phpbb_root_path}includes/search/$type.$phpEx");
 593   
 594          if (!class_exists($type))
 595          {
 596              $error = $user->lang['NO_SUCH_SEARCH_MODULE'];
 597              return $error;
 598          }
 599   
 600          $error = false;
 601          $search = new $type($error);
 602   
 603          return $error;
 604      }
 605  }
 606   
 607  ?>