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

index.php

Zuletzt modifiziert: 09.10.2024, 12:50 - Dateigröße: 20.75 KiB


001  <?php
002  /**
003  *
004  * @package install
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  define('IN_PHPBB', true);
015  define('IN_INSTALL', true);
016  /**#@-*/
017   
018  $phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './../';
019  $phpEx = substr(strrchr(__FILE__, '.'), 1);
020   
021  // Report all errors, except notices
022  error_reporting(E_ALL ^ E_NOTICE);
023   
024  // @todo Review this test and see if we can find out what it is which prevents PHP 4.2.x from even displaying the page with requirements on it
025  if (version_compare(PHP_VERSION, '4.3.3') < 0)
026  {
027      die('You are running an unsupported PHP version. Please upgrade to PHP 4.3.3 or higher before trying to install phpBB 3.0');
028  }
029   
030  /*
031  * Remove variables created by register_globals from the global scope
032  * Thanks to Matt Kavanagh
033  */
034  function deregister_globals()
035  {
036      $not_unset = array(
037          'GLOBALS'    => true,
038          '_GET'        => true,
039          '_POST'        => true,
040          '_COOKIE'    => true,
041          '_REQUEST'    => true,
042          '_SERVER'    => true,
043          '_SESSION'    => true,
044          '_ENV'        => true,
045          '_FILES'    => true,
046          'phpEx'        => true,
047          'phpbb_root_path'    => true
048      );
049   
050      // Not only will array_merge and array_keys give a warning if
051      // a parameter is not an array, array_merge will actually fail.
052      // So we check if _SESSION has been initialised.
053      if (!isset($_SESSION) || !is_array($_SESSION))
054      {
055          $_SESSION = array();
056      }
057   
058      // Merge all into one extremely huge array; unset this later
059      $input = array_merge(
060          array_keys($_GET),
061          array_keys($_POST),
062          array_keys($_COOKIE),
063          array_keys($_SERVER),
064          array_keys($_SESSION),
065          array_keys($_ENV),
066          array_keys($_FILES)
067      );
068   
069      foreach ($input as $varname)
070      {
071          if (isset($not_unset[$varname]))
072          {
073              // Hacking attempt. No point in continuing unless it's a COOKIE
074              if ($varname !== 'GLOBALS' || isset($_GET['GLOBALS']) || isset($_POST['GLOBALS']) || isset($_SERVER['GLOBALS']) || isset($_SESSION['GLOBALS']) || isset($_ENV['GLOBALS']) || isset($_FILES['GLOBALS']))
075              {
076                  exit;
077              }
078              else
079              {
080                  $cookie = &$_COOKIE;
081                  while (isset($cookie['GLOBALS']))
082                  {
083                      foreach ($cookie['GLOBALS'] as $registered_var => $value)
084                      {
085                          if (!isset($not_unset[$registered_var]))
086                          {
087                              unset($GLOBALS[$registered_var]);
088                          }
089                      }
090                      $cookie = &$cookie['GLOBALS'];
091                  }
092              }
093          }
094   
095          unset($GLOBALS[$varname]);
096      }
097   
098      unset($input);
099  }
100   
101  // If we are on PHP >= 6.0.0 we do not need some code
102  if (version_compare(PHP_VERSION, '6.0.0-dev', '>='))
103  {
104      /**
105      * @ignore
106      */
107      define('STRIP', false);
108  }
109  else
110  {
111      set_magic_quotes_runtime(0);
112   
113      // Be paranoid with passed vars
114      if (@ini_get('register_globals') == '1' || strtolower(@ini_get('register_globals')) == 'on')
115      {
116          deregister_globals();
117      }
118   
119      define('STRIP', (get_magic_quotes_gpc()) ? true : false);
120  }
121   
122  // Try to override some limits - maybe it helps some...
123  @set_time_limit(0);
124  $mem_limit = @ini_get('memory_limit');
125  if (!empty($mem_limit))
126  {
127      $unit = strtolower(substr($mem_limit, -1, 1));
128      $mem_limit = (int) $mem_limit;
129   
130      if ($unit == 'k')
131      {
132          $mem_limit = floor($mem_limit / 1024);
133      }
134      else if ($unit == 'g')
135      {
136          $mem_limit *= 1024;
137      }
138      else if (is_numeric($unit))
139      {
140          $mem_limit = floor((int) ($mem_limit . $unit) / 1048576);
141      }
142      $mem_limit = max(128, $mem_limit) . 'M';
143  }
144  else
145  {
146      $mem_limit = '128M';
147  }
148  @ini_set('memory_limit', $mem_limit);
149   
150  // Include essential scripts
151  require($phpbb_root_path . 'includes/functions.' . $phpEx);
152   
153  if (file_exists($phpbb_root_path . 'includes/functions_content.' . $phpEx))
154  {
155      require($phpbb_root_path . 'includes/functions_content.' . $phpEx);
156  }
157   
158  include($phpbb_root_path . 'includes/auth.' . $phpEx);
159  include($phpbb_root_path . 'includes/session.' . $phpEx);
160  include($phpbb_root_path . 'includes/template.' . $phpEx);
161  include($phpbb_root_path . 'includes/acm/acm_file.' . $phpEx);
162  include($phpbb_root_path . 'includes/cache.' . $phpEx);
163  include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
164  include($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
165  require($phpbb_root_path . 'includes/functions_install.' . $phpEx);
166   
167  // Try and load an appropriate language if required
168  $language = basename(request_var('language', ''));
169   
170  if (!empty($_SERVER['HTTP_ACCEPT_LANGUAGE']) && !$language)
171  {
172      $accept_lang_ary = explode(',', strtolower($_SERVER['HTTP_ACCEPT_LANGUAGE']));
173      foreach ($accept_lang_ary as $accept_lang)
174      {
175          // Set correct format ... guess full xx_yy form
176          $accept_lang = substr($accept_lang, 0, 2) . '_' . substr($accept_lang, 3, 2);
177   
178          if (file_exists($phpbb_root_path . 'language/' . $accept_lang))
179          {
180              $language = $accept_lang;
181              break;
182          }
183          else
184          {
185              // No match on xx_yy so try xx
186              $accept_lang = substr($accept_lang, 0, 2);
187              if (file_exists($phpbb_root_path . 'language/' . $accept_lang))
188              {
189                  $language = $accept_lang;
190                  break;
191              }
192          }
193      }
194  }
195   
196  // No appropriate language found ... so let's use the first one in the language
197  // dir, this may or may not be English
198  if (!$language)
199  {
200      $dir = @opendir($phpbb_root_path . 'language');
201   
202      if (!$dir)
203      {
204          die('Unable to access the language directory');
205          exit;
206      }
207   
208      while (($file = readdir($dir)) !== false)
209      {
210          $path = $phpbb_root_path . 'language/' . $file;
211   
212          if (!is_file($path) && !is_link($path) && file_exists($path . '/iso.txt'))
213          {
214              $language = $file;
215              break;
216          }
217      }
218      closedir($dir);
219  }
220   
221  if (!file_exists($phpbb_root_path . 'language/' . $language))
222  {
223      die('No language found!');
224  }
225   
226  // And finally, load the relevant language files
227  include($phpbb_root_path . 'language/' . $language . '/common.' . $phpEx);
228  include($phpbb_root_path . 'language/' . $language . '/acp/common.' . $phpEx);
229  include($phpbb_root_path . 'language/' . $language . '/acp/board.' . $phpEx);
230  include($phpbb_root_path . 'language/' . $language . '/install.' . $phpEx);
231  include($phpbb_root_path . 'language/' . $language . '/posting.' . $phpEx);
232   
233  $mode = request_var('mode', 'overview');
234  $sub = request_var('sub', '');
235   
236  // Set PHP error handler to ours
237  set_error_handler(defined('PHPBB_MSG_HANDLER') ? PHPBB_MSG_HANDLER : 'msg_handler');
238   
239  $user = new user();
240  $auth = new auth();
241  $cache = new cache();
242  $template = new template();
243   
244  // Add own hook handler, if present. :o
245  if (file_exists($phpbb_root_path . 'includes/hooks/index.' . $phpEx))
246  {
247      require($phpbb_root_path . 'includes/hooks/index.' . $phpEx);
248      $phpbb_hook = new phpbb_hook(array('exit_handler', 'phpbb_user_session_handler', 'append_sid', array('template', 'display')));
249   
250      foreach ($cache->obtain_hooks() as $hook)
251      {
252          @include($phpbb_root_path . 'includes/hooks/' . $hook . '.' . $phpEx);
253      }
254  }
255  else
256  {
257      $phpbb_hook = false;
258  }
259   
260  // Set some standard variables we want to force
261  $config = array(
262      'load_tplcompile'    => '1'
263  );
264   
265  $template->set_custom_template('../adm/style', 'admin');
266  $template->assign_var('T_TEMPLATE_PATH', '../adm/style');
267   
268  // the acp template is never stored in the database
269  $user->theme['template_storedb'] = false;
270   
271  $install = new module();
272   
273  $install->create('install', "index.$phpEx", $mode, $sub);
274  $install->load();
275   
276  // Generate the page
277  $install->page_header();
278  $install->generate_navigation();
279   
280  $template->set_filenames(array(
281      'body' => $install->get_tpl_name())
282  );
283   
284  $install->page_footer();
285   
286  /**
287  * @package install
288  */
289  class module
290  {
291      var $id = 0;
292      var $type = 'install';
293      var $module_ary = array();
294      var $filename;
295      var $module_url = '';
296      var $tpl_name = '';
297      var $mode;
298      var $sub;
299   
300      /**
301      * Private methods, should not be overwritten
302      */
303      function create($module_type, $module_url, $selected_mod = false, $selected_submod = false)
304      {
305          global $db, $config, $phpEx, $phpbb_root_path;
306   
307          $module = array();
308   
309          // Grab module information using Bart's "neat-o-module" system (tm)
310          $dir = @opendir('.');
311   
312          if (!$dir)
313          {
314              $this->error('Unable to access the installation directory', __LINE__, __FILE__);
315          }
316   
317          $setmodules = 1;
318          while (($file = readdir($dir)) !== false)
319          {
320              if (preg_match('#^install_(.*?)\.' . $phpEx . '$#', $file))
321              {
322                  include($file);
323              }
324          }
325          closedir($dir);
326   
327          unset($setmodules);
328   
329          if (!sizeof($module))
330          {
331              $this->error('No installation modules found', __LINE__, __FILE__);
332          }
333   
334          // Order to use and count further if modules get assigned to the same position or not having an order
335          $max_module_order = 1000;
336   
337          foreach ($module as $row)
338          {
339              // Check any module pre-reqs
340              if ($row['module_reqs'] != '')
341              {
342              }
343   
344              // Module order not specified or module already assigned at this position?
345              if (!isset($row['module_order']) || isset($this->module_ary[$row['module_order']]))
346              {
347                  $row['module_order'] = $max_module_order;
348                  $max_module_order++;
349              }
350   
351              $this->module_ary[$row['module_order']]['name'] = $row['module_title'];
352              $this->module_ary[$row['module_order']]['filename'] = $row['module_filename'];
353              $this->module_ary[$row['module_order']]['subs'] = $row['module_subs'];
354              $this->module_ary[$row['module_order']]['stages'] = $row['module_stages'];
355   
356              if (strtolower($selected_mod) == strtolower($row['module_title']))
357              {
358                  $this->id = (int) $row['module_order'];
359                  $this->filename = (string) $row['module_filename'];
360                  $this->module_url = (string) $module_url;
361                  $this->mode = (string) $selected_mod;
362                  // Check that the sub-mode specified is valid or set a default if not
363                  if (is_array($row['module_subs']))
364                  {
365                      $this->sub = strtolower((in_array(strtoupper($selected_submod), $row['module_subs'])) ? $selected_submod : $row['module_subs'][0]);
366                  }
367                  else if (is_array($row['module_stages']))
368                  {
369                      $this->sub = strtolower((in_array(strtoupper($selected_submod), $row['module_stages'])) ? $selected_submod : $row['module_stages'][0]);
370                  }
371                  else
372                  {
373                      $this->sub = '';
374                  }
375              }
376          } // END foreach
377      } // END create
378   
379      /**
380      * Load and run the relevant module if applicable
381      */
382      function load($mode = false, $run = true)
383      {
384          global $phpbb_root_path, $phpEx;
385   
386          if ($run)
387          {
388              if (!empty($mode))
389              {
390                  $this->mode = $mode;
391              }
392   
393              $module = $this->filename;
394              if (!class_exists($module))
395              {
396                  $this->error('Module "' . htmlspecialchars($module) . '" not accessible.', __LINE__, __FILE__);
397              }
398              $this->module = new $module($this);
399   
400              if (method_exists($this->module, 'main'))
401              {
402                  $this->module->main($this->mode, $this->sub);
403              }
404          }
405      }
406   
407      /**
408      * Output the standard page header
409      */
410      function page_header()
411      {
412          if (defined('HEADER_INC'))
413          {
414              return;
415          }
416   
417          define('HEADER_INC', true);
418          global $template, $lang, $stage, $phpbb_root_path;
419   
420          $template->assign_vars(array(
421              'L_CHANGE'                => $lang['CHANGE'],
422              'L_INSTALL_PANEL'        => $lang['INSTALL_PANEL'],
423              'L_SELECT_LANG'            => $lang['SELECT_LANG'],
424              'L_SKIP'                => $lang['SKIP'],
425              'PAGE_TITLE'            => $this->get_page_title(),
426              'T_IMAGE_PATH'            => $phpbb_root_path . 'adm/images/',
427   
428              'S_CONTENT_DIRECTION'     => $lang['DIRECTION'],
429              'S_CONTENT_FLOW_BEGIN'    => ($lang['DIRECTION'] == 'ltr') ? 'left' : 'right',
430              'S_CONTENT_FLOW_END'    => ($lang['DIRECTION'] == 'ltr') ? 'right' : 'left',
431              'S_CONTENT_ENCODING'     => 'UTF-8',
432   
433              'S_USER_LANG'            => $lang['USER_LANG'],
434              )
435          );
436   
437          header('Content-type: text/html; charset=UTF-8');
438          header('Cache-Control: private, no-cache="set-cookie"');
439          header('Expires: 0');
440          header('Pragma: no-cache');
441   
442          return;
443      }
444   
445      /**
446      * Output the standard page footer
447      */
448      function page_footer()
449      {
450          global $db, $template;
451   
452          $template->display('body');
453      
454          // Close our DB connection.
455          if (!empty($db) && is_object($db))
456          {
457              $db->sql_close();
458          }
459   
460          if (function_exists('exit_handler'))
461          {
462              exit_handler();
463          }
464      }
465   
466      /**
467      * Returns desired template name
468      */
469      function get_tpl_name()
470      {
471          return $this->module->tpl_name . '.html';
472      }
473   
474      /**
475      * Returns the desired page title
476      */
477      function get_page_title()
478      {
479          global $lang;
480   
481          if (!isset($this->module->page_title))
482          {
483              return '';
484          }
485   
486          return (isset($lang[$this->module->page_title])) ? $lang[$this->module->page_title] : $this->module->page_title;
487      }
488   
489      /**
490      * Generate an HTTP/1.1 header to redirect the user to another page
491      * This is used during the installation when we do not have a database available to call the normal redirect function
492      * @param string $page The page to redirect to relative to the installer root path
493      */
494      function redirect($page)
495      {
496          $server_name = (!empty($_SERVER['SERVER_NAME'])) ? $_SERVER['SERVER_NAME'] : getenv('SERVER_NAME');
497          $server_port = (!empty($_SERVER['SERVER_PORT'])) ? (int) $_SERVER['SERVER_PORT'] : (int) getenv('SERVER_PORT');
498          $secure = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') ? 1 : 0;
499   
500          $script_name = (!empty($_SERVER['PHP_SELF'])) ? $_SERVER['PHP_SELF'] : getenv('PHP_SELF');
501          if (!$script_name)
502          {
503              $script_name = (!empty($_SERVER['REQUEST_URI'])) ? $_SERVER['REQUEST_URI'] : getenv('REQUEST_URI');
504          }
505   
506          // Replace backslashes and doubled slashes (could happen on some proxy setups)
507          $script_name = str_replace(array('\\', '//'), '/', $script_name);
508          $script_path = trim(dirname($script_name));
509   
510          $url = (($secure) ? 'https://' : 'http://') . $server_name;
511   
512          if ($server_port && (($secure && $server_port <> 443) || (!$secure && $server_port <> 80)))
513          {
514              $url .= ':' . $server_port;
515          }
516   
517          $url .= $script_path . '/' . $page;
518          header('Location: ' . $url);
519          exit;
520      }
521   
522      /**
523      * Generate the navigation tabs
524      */
525      function generate_navigation()
526      {
527          global $lang, $template, $phpEx, $language;
528   
529          if (is_array($this->module_ary))
530          {
531              @ksort($this->module_ary);
532              foreach ($this->module_ary as $cat_ary)
533              {
534                  $cat = $cat_ary['name'];
535                  $l_cat = (!empty($lang['CAT_' . $cat])) ? $lang['CAT_' . $cat] : preg_replace('#_#', ' ', $cat);
536                  $cat = strtolower($cat);
537                  $url = $this->module_url . "?mode=$cat&amp;language=$language";
538                  
539                  if ($this->mode == $cat)
540                  {
541                      $template->assign_block_vars('t_block1', array(
542                          'L_TITLE'        => $l_cat,
543                          'S_SELECTED'    => true,
544                          'U_TITLE'        => $url,
545                      ));
546   
547                      if (is_array($this->module_ary[$this->id]['subs']))
548                      {
549                          $subs = $this->module_ary[$this->id]['subs'];
550                          foreach ($subs as $option)
551                          {
552                              $l_option = (!empty($lang['SUB_' . $option])) ? $lang['SUB_' . $option] : preg_replace('#_#', ' ', $option);
553                              $option = strtolower($option);
554                              $url = $this->module_url . '?mode=' . $this->mode . "&amp;sub=$option&amp;language=$language";
555   
556                              $template->assign_block_vars('l_block1', array(
557                                  'L_TITLE'        => $l_option,
558                                  'S_SELECTED'    => ($this->sub == $option),
559                                  'U_TITLE'        => $url,
560                              ));
561                          }
562                      }
563   
564                      if (is_array($this->module_ary[$this->id]['stages']))
565                      {
566                          $subs = $this->module_ary[$this->id]['stages'];
567                          $matched = false;
568                          foreach ($subs as $option)
569                          {
570                              $l_option = (!empty($lang['STAGE_' . $option])) ? $lang['STAGE_' . $option] : preg_replace('#_#', ' ', $option);
571                              $option = strtolower($option);
572                              $matched = ($this->sub == $option) ? true : $matched;
573   
574                              $template->assign_block_vars('l_block2', array(
575                                  'L_TITLE'        => $l_option,
576                                  'S_SELECTED'    => ($this->sub == $option),
577                                  'S_COMPLETE'    => !$matched,
578                              ));
579                          }
580                      }
581                  }
582                  else
583                  {
584                      $template->assign_block_vars('t_block1', array(
585                          'L_TITLE'        => $l_cat,
586                          'S_SELECTED'    => false,
587                          'U_TITLE'        => $url,
588                      ));
589                  }
590              }
591          }
592      }
593   
594      /**
595      * Output an error message
596      * If skip is true, return and continue execution, else exit
597      */
598      function error($error, $line, $file, $skip = false)
599      {
600          global $lang, $db, $template;
601   
602          if ($skip)
603          {
604              $template->assign_block_vars('checks', array(
605                  'S_LEGEND'    => true,
606                  'LEGEND'    => $lang['INST_ERR'],
607              ));
608   
609              $template->assign_block_vars('checks', array(
610                  'TITLE'        => basename($file) . ' [ ' . $line . ' ]',
611                  'RESULT'    => '<b style="color:red">' . $error . '</b>',
612              ));
613   
614              return;
615          }
616   
617          echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">';
618          echo '<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">';
619          echo '<head>';
620          echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';
621          echo '<title>' . $lang['INST_ERR_FATAL'] . '</title>';
622          echo '<link href="../adm/style/admin.css" rel="stylesheet" type="text/css" media="screen" />';
623          echo '</head>';
624          echo '<body id="errorpage">';
625          echo '<div id="wrap">';
626          echo '    <div id="page-header">';
627          echo '    </div>';
628          echo '    <div id="page-body">';
629          echo '        <div id="acp">';
630          echo '        <div class="panel">';
631          echo '            <span class="corners-top"><span></span></span>';
632          echo '            <div id="content">';
633          echo '                <h1>' . $lang['INST_ERR_FATAL'] . '</h1>';
634          echo '        <p>' . $lang['INST_ERR_FATAL'] . "</p>\n";
635          echo '        <p>' . basename($file) . ' [ ' . $line . " ]</p>\n";
636          echo '        <p><b>' . $error . "</b></p>\n";
637          echo '            </div>';
638          echo '            <span class="corners-bottom"><span></span></span>';
639          echo '        </div>';
640          echo '        </div>';
641          echo '    </div>';
642          echo '    <div id="page-footer">';
643          echo '        Powered by phpBB &copy; 2000, 2002, 2005, 2007 <a href="http://www.phpbb.com/">phpBB Group</a>';
644          echo '    </div>';
645          echo '</div>';
646          echo '</body>';
647          echo '</html>';
648   
649          if (!empty($db) && is_object($db))
650          {
651              $db->sql_close();
652          }
653   
654          exit_handler();
655      }
656   
657      /**
658      * Output an error message for a database related problem
659      * If skip is true, return and continue execution, else exit
660      */
661      function db_error($error, $sql, $line, $file, $skip = false)
662      {
663          global $lang, $db, $template;
664   
665          if ($skip)
666          {
667              $template->assign_block_vars('checks', array(
668                  'S_LEGEND'    => true,
669                  'LEGEND'    => $lang['INST_ERR_FATAL'],
670              ));
671   
672              $template->assign_block_vars('checks', array(
673                  'TITLE'        => basename($file) . ' [ ' . $line . ' ]',
674                  'RESULT'    => '<b style="color:red">' . $error . '</b><br />&#187; SQL:' . $sql,
675              ));
676   
677              return;
678          }
679   
680          $template->set_filenames(array(
681              'body' => 'install_error.html')
682          );
683          $this->page_header();
684          $this->generate_navigation();
685   
686          $template->assign_vars(array(
687              'MESSAGE_TITLE'        => $lang['INST_ERR_FATAL_DB'],
688              'MESSAGE_TEXT'        => '<p>' . basename($file) . ' [ ' . $line . ' ]</p><p>SQL : ' . $sql . '</p><p><b>' . $error . '</b></p>',
689          ));
690   
691          // Rollback if in transaction
692          if ($db->transaction)
693          {
694              $db->sql_transaction('rollback');
695          }
696   
697          $this->page_footer();
698      }
699   
700      /**
701      * Generate the relevant HTML for an input field and the associated label and explanatory text
702      */
703      function input_field($name, $type, $value='', $options='')
704      {
705          global $lang;
706          $tpl_type = explode(':', $type);
707          $tpl = '';
708   
709          switch ($tpl_type[0])
710          {
711              case 'text':
712              case 'password':
713                  $size = (int) $tpl_type[1];
714                  $maxlength = (int) $tpl_type[2];
715   
716                  $tpl = '<input id="' . $name . '" type="' . $tpl_type[0] . '"' . (($size) ? ' size="' . $size . '"' : '') . ' maxlength="' . (($maxlength) ? $maxlength : 255) . '" name="' . $name . '" value="' . $value . '" />';
717              break;
718   
719              case 'textarea':
720                  $rows = (int) $tpl_type[1];
721                  $cols = (int) $tpl_type[2];
722   
723                  $tpl = '<textarea id="' . $name . '" name="' . $name . '" rows="' . $rows . '" cols="' . $cols . '">' . $value . '</textarea>';
724              break;
725   
726              case 'radio':
727                  $key_yes    = ($value) ? ' checked="checked" id="' . $name . '"' : '';
728                  $key_no        = (!$value) ? ' checked="checked" id="' . $name . '"' : '';
729   
730                  $tpl_type_cond = explode('_', $tpl_type[1]);
731                  $type_no = ($tpl_type_cond[0] == 'disabled' || $tpl_type_cond[0] == 'enabled') ? false : true;
732   
733                  $tpl_no = '<label><input type="radio" name="' . $name . '" value="0"' . $key_no . ' class="radio" /> ' . (($type_no) ? $lang['NO'] : $lang['DISABLED']) . '</label>';
734                  $tpl_yes = '<label><input type="radio" name="' . $name . '" value="1"' . $key_yes . ' class="radio" /> ' . (($type_no) ? $lang['YES'] : $lang['ENABLED']) . '</label>';
735   
736                  $tpl = ($tpl_type_cond[0] == 'yes' || $tpl_type_cond[0] == 'enabled') ? $tpl_yes . '&nbsp;&nbsp;' . $tpl_no : $tpl_no . '&nbsp;&nbsp;' . $tpl_yes;
737              break;
738   
739              case 'select':
740                  eval('$s_options = ' . str_replace('{VALUE}', $value, $options) . ';');
741                  $tpl = '<select id="' . $name . '" name="' . $name . '">' . $s_options . '</select>';
742              break;
743   
744              case 'custom':
745                  eval('$tpl = ' . str_replace('{VALUE}', $value, $options) . ';');
746              break;
747   
748              default:
749              break;
750          }
751   
752          return $tpl;
753      }
754   
755      /**
756      * Generate the drop down of available language packs
757      */
758      function inst_language_select($default = '')
759      {
760          global $phpbb_root_path, $phpEx;
761   
762          $dir = @opendir($phpbb_root_path . 'language');
763   
764          if (!$dir)
765          {
766              $this->error('Unable to access the language directory', __LINE__, __FILE__);
767          }
768   
769          while ($file = readdir($dir))
770          {
771              $path = $phpbb_root_path . 'language/' . $file;
772   
773              if ($file == '.' || $file == '..' || is_link($path) || is_file($path) || $file == 'CVS')
774              {
775                  continue;
776              }
777   
778              if (file_exists($path . '/iso.txt'))
779              {
780                  list($displayname, $localname) = @file($path . '/iso.txt');
781                  $lang[$localname] = $file;
782              }
783          }
784          closedir($dir);
785   
786          @asort($lang);
787          @reset($lang);
788   
789          $user_select = '';
790          foreach ($lang as $displayname => $filename)
791          {
792              $selected = (strtolower($default) == strtolower($filename)) ? ' selected="selected"' : '';
793              $user_select .= '<option value="' . $filename . '"' . $selected . '>' . ucwords($displayname) . '</option>';
794          }
795   
796          return $user_select;
797      }
798  }
799   
800  ?>