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  ?>