MDL-17457 migrated all modules to new db/install.php; added upgrade.txt file for...
[moodle.git] / install.php
1 <?php /// $Id$
2       /// install.php - helps admin user to create a config.php file
4 /// If config.php exists already then we are not needed.
6 if (file_exists('./config.php')) {
7     header('Location: index.php');
8     die;
9 } else {
10     $configfile = './config.php';
11 }
13 ///==========================================================================//
14 /// We are doing this in stages
15 define ('WELCOME',            0); /// 0. Welcome and language settings
16 define ('COMPATIBILITY',      1); /// 1. Compatibility
17 define ('DIRECTORY',          2); /// 2. Directory settings
18 define ('DATABASE',           3); /// 2. Database settings
19 define ('ADMIN',              4); /// 4. Administration directory name
20 define ('ENVIRONMENT',        5); /// 5. Administration directory name
21 define ('DOWNLOADLANG',       6); /// 6. Load complete lang from download.moodle.org
22 define ('SAVE',               7); /// 7. Save or display the settings
23 define ('REDIRECT',           8); /// 8. Redirect to index.php
24 ///==========================================================================//
27 /// This has to be defined to avoid a notice in current_language()
28 define('SITEID', 0);
30 /// Begin the session as we are holding all information in a session
31 /// variable until the end.
33 session_name('MoodleSession');
34 @session_start();
36 /// make sure PHP errors are displayed to help diagnose problems
37 @error_reporting(1023); //E_ALL not used because we do not want strict notices in PHP5 yet
38 @ini_set('display_errors', '1');
40 if (! isset($_SESSION['INSTALL'])) {
41     $_SESSION['INSTALL'] = array();
42 }
44 $INSTALL = &$_SESSION['INSTALL'];   // Makes it easier to reference
46 /// detect if install was attempted from diferent directory, if yes reset session to prevent errors,
47 /// dirroot location now fixed in installer
48 if (!empty($INSTALL['dirroot']) and $INSTALL['dirroot'] != dirname(__FILE__)) {
49     $_SESSION['INSTALL'] = array();
50 }
52 /// If it's our first time through this script then we need to set some default values
54 if ( empty($INSTALL['language']) and empty($_POST['language']) ) {
56     /// set defaults
57     $INSTALL['language']        = 'en_utf8';
59     $INSTALL['dbhost']          = 'localhost';
60     $INSTALL['dbuser']          = '';
61     $INSTALL['dbpass']          = '';
62     $INSTALL['dbtype']          = 'mysqli_adodb';
63     $INSTALL['dbname']          = 'moodle';
64     $INSTALL['prefix']          = 'mdl_';
66     $INSTALL['downloadlangpack']       = false;
67     $INSTALL['showdownloadlangpack']   = true;
68     $INSTALL['downloadlangpackerror']  = '';
70 /// To be used by the Installer
71     $INSTALL['wwwroot']         = '';
72     $INSTALL['dirroot']         = dirname(__FILE__);
73     $INSTALL['dataroot']        = dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'moodledata';
75 /// To be configured in the Installer
76     $INSTALL['wwwrootform']         = '';
77     $INSTALL['dirrootform']         = dirname(__FILE__);
79     $INSTALL['admindirname']    = 'admin';
81     $INSTALL['stage'] = WELCOME;
82 }
84 //==========================================================================//
86 /// Set the page to Unicode always
88 header('Content-Type: text/html; charset=UTF-8');
90 /// Was data submitted?
92 if (isset($_POST['stage'])) {
94     /// Get the stage for which the form was set and the next stage we are going to
96     $gpc = ini_get('magic_quotes_gpc');
97     $gpc = ($gpc == '1' or strtolower($gpc) == 'on');
99     /// Store any posted data
100     foreach ($_POST as $setting=>$value) {
101         if ($gpc) {
102             $value = stripslashes($value);
103         }
105         $INSTALL[$setting] = $value;
106     }
108     if ( $goforward = (! empty( $_POST['next'] )) ) {
109         $nextstage = $_POST['stage'] + 1;
110     } else if (! empty( $_POST['prev'])) {
111         $nextstage = $_POST['stage'] - 1;
112         $INSTALL['stage'] = $_POST['stage'] - 1;
113     } else if (! empty( $_POST['same'] )) {
114         $nextstage = $_POST['stage'];
115     }
117     $nextstage = (int)$nextstage;
119     if ($nextstage < 0) {
120         $nextstage = WELCOME;
121     }
124 } else {
126     $goforward = true;
127     $nextstage = WELCOME;
131 //==========================================================================//
133 /// Fake some settings so that we can use selected functions from moodlelib.php and weblib.php
135 $SESSION->lang = (!empty($_POST['language'])) ? $_POST['language'] : $INSTALL['language'];
136 $CFG->dirroot = $INSTALL['dirroot'];
137 $CFG->libdir = $INSTALL['dirroot'].'/lib';
138 $CFG->dataroot = $INSTALL['dataroot'];
139 $CFG->admin = $INSTALL['admindirname'];
140 $CFG->directorypermissions = 00777;
141 $CFG->running_installer = true;
142 $CFG->docroot = 'http://docs.moodle.org';
143 $CFG->httpswwwroot = $INSTALL['wwwrootform']; // Needed by doc_link() in Server Checks page.
144 $COURSE->id = 0;
146 /// Include some moodle libraries
148 require_once($CFG->libdir.'/setuplib.php');
149 require_once($CFG->libdir.'/installlib.php');
150 require_once($CFG->libdir.'/weblib.php');
151 require_once($CFG->libdir.'/deprecatedlib.php');
152 require_once($CFG->libdir.'/moodlelib.php');
153 require_once($CFG->libdir.'/adminlib.php');
154 require_once($CFG->libdir.'/environmentlib.php');
155 require_once($CFG->libdir.'/xmlize.php');
156 require_once($CFG->libdir.'/componentlib.class.php');
157 require_once($CFG->dirroot.'/version.php');
159 /// Set version and release
160 $INSTALL['version'] = $version;
161 $INSTALL['release'] = $release;
163 /// list all supported drivers - unsupported must be installed manually ;-)
164 $supported = array (
165     'mysqli_adodb',
166     'mysql_adodb',
167     'postgres7_adodb',
168     'mssql_n_adodb',
169     'mssql_adodb',
170     'odbc_mssql_adodb',
171     'oci8po_adodb',
172     'sqlite3_pdo',
173 );
174 $databases = array ();
175 foreach($supported as $driver) {
176     $classname = $driver.'_moodle_database';
177     require_once ("$CFG->libdir/dml/$classname.php");
178     $databases[$driver] = new $classname ();
181 /// guess the www root
182 if ($INSTALL['wwwroot'] == '') {
183     $INSTALL['wwwroot'] = install_guess_wwwroot();
184     $INSTALL['wwwrootform'] = $INSTALL['wwwroot'];
186     // now try to guess the correct dataroot not accessible via web
187     $CFG->wwwroot = $INSTALL['wwwroot'];
188     $i = 0; //safety check - dirname might return some unexpected results
189     while(is_dataroot_insecure()) {
190         $parrent = dirname($CFG->dataroot);
191         $i++;
192         if ($parrent == '/' or $parrent == '.' or preg_match('/^[a-z]:\\\?$/i', $parrent) or ($i > 100)) {
193             $CFG->dataroot = ''; //can not find secure location for dataroot
194             break;
195         }
196         $CFG->dataroot = dirname($parrent).'/moodledata';
197     }
198         $INSTALL['dataroot'] = $CFG->dataroot;
201 $headstagetext = array(WELCOME       => get_string('chooselanguagehead', 'install'),
202                        COMPATIBILITY => get_string('compatibilitysettingshead', 'install'),
203                        DIRECTORY     => get_string('directorysettingshead', 'install'),
204                        DATABASE      => get_string('databasesettingshead', 'install'),
205                        ADMIN         => get_string('admindirsettinghead', 'install'),
206                        ENVIRONMENT   => get_string('environmenthead', 'install'),
207                        DOWNLOADLANG  => get_string('downloadlanguagehead', 'install'),
208                        SAVE          => get_string('configurationcompletehead', 'install')
209                         );
211 $substagetext = array(WELCOME       => get_string('chooselanguagesub', 'install'),
212                       COMPATIBILITY => get_string('compatibilitysettingssub', 'install'),
213                       DIRECTORY     => get_string('directorysettingssub', 'install'),
214                       DATABASE      => get_string('databasesettingssub', 'install'),
215                       ADMIN         => get_string('admindirsettingsub', 'install'),
216                       ENVIRONMENT   => get_string('environmentsub', 'install'),
217                       DOWNLOADLANG  => get_string('downloadlanguagesub', 'install'),
218                       SAVE          => get_string('configurationcompletesub', 'install')
219                        );
223 //==========================================================================//
225 /// Are we in help mode?
227 if (isset($_GET['help'])) {
228     $nextstage = -1;
233 //==========================================================================//
235 /// Are we in config download mode?
237 if (isset($_GET['download'])) {
238     header("Content-Type: application/x-forcedownload\n");
239     header("Content-Disposition: attachment; filename=\"config.php\"");
240     echo $INSTALL['config'];
241     exit;
248 //==========================================================================//
250 /// Check the directory settings
252 if ($INSTALL['stage'] == DIRECTORY) {
254     error_reporting(0);
256     /// check wwwroot
257     if (ini_get('allow_url_fopen') && false) { /// This was not reliable
258         if (($fh = @fopen($INSTALL['wwwrootform'].'/install.php', 'r')) === false) {
259             $errormsg .= get_string('wwwrooterror', 'install').'<br />';
260             $INSTALL['wwwrootform'] = $INSTALL['wwwroot'];
261             fclose($fh);
262         }
263     }
265     /// check dirroot
266     if (($fh = @fopen($INSTALL['dirrootform'].'/install.php', 'r')) === false) {
267         $errormsg .= get_string('dirrooterror', 'install').'<br />';
268         $INSTALL['dirrootform'] = $INSTALL['dirroot'];
269         fclose($fh);
270     }
272     /// check dataroot
273     $CFG->dataroot = $INSTALL['dataroot'];
274     $CFG->wwwroot  = $INSTALL['wwwroot'];
275     if (make_upload_directory('sessions', false) === false) {
276         $errormsg .= get_string('datarooterror', 'install').'<br />';
278     } else if (is_dataroot_insecure(true) == INSECURE_DATAROOT_ERROR) {
279         $errormsg .= get_string('datarootpublicerror', 'install').'<br />';
280     }
282     if (!empty($errormsg)) {
283         $nextstage = DIRECTORY;
284     }
286     error_reporting(38911);
291 //==========================================================================//
293 /// Check database settings if stage 3 data submitted
294 /// Try to connect to the database. If that fails then try to create the database
296 if ($INSTALL['stage'] == DATABASE) {
298     $DB = $databases[$INSTALL['dbtype']];
300     $dbfamily = $DB->get_dbfamily();
301     $errormsg = $DB->driver_installed();
303     if ($errormsg === true) {
304         $errormsg = '';
305     } else {
306         $nextstage = DATABASE;
307     }
309     if (empty($INSTALL['prefix']) and $dbfamily != 'mysql') { // All DBs but MySQL require prefix (reserv. words)
310         $errormsg = get_string('dbwrongprefix', 'install');
311         $nextstage = DATABASE;
312     }
314     if ($dbfamily == 'oracle' and strlen($INSTALL['prefix']) > 2) { // Oracle max prefix = 2cc (30cc limit)
315         $errormsg = get_string('dbwrongprefix', 'install');
316         $nextstage = DATABASE;
317     }
319     if ($dbfamily == 'oracle' and !empty ($INSTALL['dbhost'])) { // Oracle host must be blank (tnsnames.ora has it)
320         $errormsg = get_string('dbwronghostserver', 'install');
321         $nextstage = DATABASE;
322     }
324     if (empty($errormsg)) {
325         error_reporting(0);  // Hide errors
327         if (! $dbconnected = $DB->connect($INSTALL['dbhost'], $INSTALL['dbuser'], $INSTALL['dbpass'], $INSTALL['dbname'], $INSTALL['prefix'])) {
328             if (!$DB->create_database($INSTALL['dbhost'], $INSTALL['dbuser'], $INSTALL['dbpass'], $INSTALL['dbname'])) {
329                  $errormsg = get_string('dbcreationerror', 'install');
330                  $nextstage = DATABASE;
331             } else {
332                 $dbconnected = $DB->connect($INSTALL['dbhost'], $INSTALL['dbuser'], $INSTALL['dbpass'], $INSTALL['dbname'], $INSTALL['prefix']);
333             }
334         } else {
335 // TODO: db encoding checks ??
336         }
337     }
339     error_reporting(38911);
341 /// Output db connection error
342     if ((empty($errormsg) and ($dbconnected === false)) ) {
343         $errormsg = get_string('dbconnectionerror', 'install');
344         $nextstage = DATABASE;
345     }
350 //==========================================================================//
352 /// If the next stage is admin directory settings OR we have just come from there then
353 /// check the admin directory.
354 /// If we can open a file then we know that the admin name is correct.
356 if ($nextstage == ADMIN or $INSTALL['stage'] == ADMIN) {
357     if (!ini_get('allow_url_fopen')) {
358         $nextstage = ($goforward) ? ENVIRONMENT : DATABASE;
359     } else if (($fh = @fopen($INSTALL['wwwrootform'].'/'.$INSTALL['admindirname'].'/environment.xml', 'r')) !== false) {
360         $nextstage = ($goforward) ? ENVIRONMENT : DATABASE;
361         fclose($fh);
362     } else {
363         $nextstage = ($goforward) ? ENVIRONMENT : DATABASE;
364         //if ($nextstage != ADMIN) {
365         //    $errormsg = get_string('admindirerror', 'install');
366         //    $nextstage = ADMIN;
367         // }
368     }
371 //==========================================================================//
373 // Check if we can navigate from the environemt page (because it's ok)
375 if ($INSTALL['stage'] == ENVIRONMENT) {
376     $DB = $databases[$INSTALL['dbtype']];
378     error_reporting(0);  // Hide errors
379     $dbconnected = $DB->connect($INSTALL['dbhost'], $INSTALL['dbuser'], $INSTALL['dbpass'], $INSTALL['dbname'], $INSTALL['prefix']);
380     error_reporting(38911);  // Show errors
381     if ($dbconnected) {
382     /// Execute environment check, printing results
383         if (!check_moodle_environment($INSTALL['release'], $environment_results, false)) {
384              $nextstage = ENVIRONMENT;
385         }
386     } else {
387     /// We never should reach this because DB has been tested before arriving here
388         $errormsg = get_string('dbconnectionerror', 'install');
389         $nextstage = DATABASE;
390     }
395 //==========================================================================//
397 // Try to download the lang pack if it has been selected
399 if ($INSTALL['stage'] == DOWNLOADLANG && $INSTALL['downloadlangpack']) {
401     $downloadsuccess = false;
402     $downloaderror = '';
404     error_reporting(0);  // Hide errors
406 /// Create necessary lang dir
407     if (!make_upload_directory('lang', false)) {
408         $downloaderror = get_string('cannotcreatelangdir', 'error');
409     }
411 /// Download and install component
412     if (($cd = new component_installer('http://download.moodle.org', 'lang16',
413         $INSTALL['language'].'.zip', 'languages.md5', 'lang')) && empty($errormsg)) {
414         $status = $cd->install(); //returns COMPONENT_(ERROR | UPTODATE | INSTALLED)
415         switch ($status) {
416             case COMPONENT_ERROR:
417                 if ($cd->get_error() == 'remotedownloaderror') {
418                     $a = new stdClass();
419                     $a->url = 'http://download.moodle.org/lang16/'.$INSTALL['language'].'.zip';
420                     $a->dest= $CFG->dataroot.'/lang';
421                     $downloaderror = get_string($cd->get_error(), 'error', $a);
422                 } else {
423                     $downloaderror = get_string($cd->get_error(), 'error');
424                 }
425             break;
426             case COMPONENT_UPTODATE:
427             case COMPONENT_INSTALLED:
428                 $downloadsuccess = true;
429             break;
430             default:
431                 //We shouldn't reach this point
432         }
433     } else {
434         //We shouldn't reach this point
435     }
437     error_reporting(38911);  // Show errors
439     if ($downloadsuccess) {
440         $INSTALL['downloadlangpack']       = false;
441         $INSTALL['showdownloadlangpack']   = false;
442         $INSTALL['downloadlangpackerror']  = $downloaderror;
443     } else {
444         $INSTALL['downloadlangpack']       = false;
445         $INSTALL['showdownloadlangpack']   = false;
446         $INSTALL['downloadlangpackerror']  = $downloaderror;
447     }
452 //==========================================================================//
454 /// Display or print the data
455 /// Put the data into a string
456 /// Try to open config file for writing.
458 if ($nextstage == SAVE) {
460     $str = '<?php  /// Moodle Configuration File ' . "\r\n";
461     $str .= "\r\n";
463     $str .= 'unset($CFG);'."\r\n";
464     $str .= '$CFG = new stdClass();'."\r\n"; // prevent PHP5 strict warnings
465     $str .= "\r\n";
467     $DB = $databases[$INSTALL['dbtype']];
468     $dbconfig = $DB->export_dbconfig($INSTALL['dbhost'], $INSTALL['dbuser'], $INSTALL['dbpass'], $INSTALL['dbname'], $INSTALL['prefix']);
470     foreach ($dbconfig as $key=>$value) {
471         $key = str_pad($key, 9);
472         $str .= '$CFG->'.$key.' = '.var_export($value, true).";\r\n";
473     }
474     $str .= "\r\n";
476     $str .= '$CFG->wwwroot   = '.var_export($INSTALL['wwwrootform'], true).";\r\n";
477     $str .= '$CFG->dirroot   = '.var_export($INSTALL['dirrootform'], true).";\r\n";
478     $str .= '$CFG->dataroot  = '.var_export($INSTALL['dataroot'], true).";\r\n";
479     $str .= '$CFG->admin     = '.var_export($INSTALL['admindirname'], true).";\r\n";
480     $str .= "\r\n";
482     $str .= '$CFG->directorypermissions = 00777;  // try 02777 on a server in Safe Mode'."\r\n";
483     $str .= "\r\n";
485     $str .= 'require_once("$CFG->dirroot/lib/setup.php");'."\r\n";
486     $str .= '// MAKE SURE WHEN YOU EDIT THIS FILE THAT THERE ARE NO SPACES, BLANK LINES,'."\r\n";
487     $str .= '// RETURNS, OR ANYTHING ELSE AFTER THE TWO CHARACTERS ON THE NEXT LINE.'."\r\n";
488     $str .= '?>';
490     umask(0137);
492     if (( $configsuccess = ($fh = @fopen($configfile, 'w')) ) !== false) {
493         fwrite($fh, $str);
494         fclose($fh);
495     }
498     $INSTALL['config'] = $str;
503 //==========================================================================//
505 ?>
506 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
507 <html dir="<?php echo (right_to_left() ? 'rtl' : 'ltr'); ?>">
508 <head>
509 <link rel="shortcut icon" href="theme/standard/favicon.ico" />
510 <title>Moodle Install</title>
511 <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
512 <?php css_styles($databases) ?>
513 <?php database_js($databases) ?>
515 </head>
517 <body>
520 <?php
521 if (isset($_GET['help'])) {
522     print_install_help($_GET['help']);
523     close_window_button();
524 } else {
525 ?>
528 <table class="main" cellpadding="3" cellspacing="0">
529     <tr>
530         <td class="td_mainlogo">
531             <p class="p_mainlogo"><img src="pix/moodlelogo-med.gif" width="240" height="60" alt="Moodle logo"/></p>
532         </td>
533         <td class="td_mainlogo" valign="bottom">
534             <p class="p_mainheader"><?php print_string('installation', 'install') ?></p>
535         </td>
536     </tr>
538     <tr>
539         <td class="td_mainheading" colspan="2">
540             <p class="p_mainheading"><?php echo $headstagetext[$nextstage] ?></p>
541             <?php /// Exceptionaly, depending of the DB selected, we show some different text
542                   /// from the standard one to show better instructions for each DB
543                 if ($nextstage == DATABASE) {
544                     foreach ($databases as $driver=>$database) {
545                         echo '<script type="text/javascript" defer="defer">window.onload=toggledbinfo;</script>';
546                         echo '<div id="'.$driver.'">' . $database->get_configuration_hints();
547                         echo '<p style="text-align: center">' . get_string('databasesettingswillbecreated', 'install') . '</p>';
548                         echo '</div>';
549                     }
550                 } else {
551                     if (!empty($substagetext[$nextstage])) {
552                         echo '<p class="p_subheading">' . $substagetext[$nextstage] . '</p>';
553                     }
554                 }
555             ?>
556         </td>
557     </tr>
559     <tr>
560         <td class="td_main" colspan="2">
562 <?php
564 if (!empty($errormsg)) echo "<p class=\"errormsg\" style=\"text-align:center\">$errormsg</p>\n";
567 if ($nextstage == SAVE) {
568     $INSTALL['stage'] = WELCOME;
569     $options = array();
570     $options['lang'] = $INSTALL['language'];
571     if ($configsuccess) {
572         echo "<p class=\"p_install\">".get_string('configfilewritten', 'install')."</p>\n";
574         echo "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">\n";
575         echo "<tr>\n";
576         echo "<td>&nbsp;</td>\n";
577         echo "<td>&nbsp;</td>\n";
578         echo "<td align=\"right\">\n";
579         print_single_button("index.php", $options, get_string('continue'));
580         echo "</td>\n";
581         echo "</tr>\n";
582         echo "</table>\n";
584     } else {
585         echo "<p class=\"errormsg\">".get_string('configfilenotwritten', 'install')."</p>";
587         echo "<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\" width=\"100%\">\n";
588         echo "<tr>\n";
589         echo "<td>&nbsp;</td>\n";
590         echo "<td align=\"center\">\n";
591         $installoptions = array();
592         $installoptions['download'] = 1;
593         print_single_button("install.php", $installoptions, get_string('download', 'install'));
594         echo "</td>\n";
595         echo "<td align=\"right\">\n";
596         print_single_button("index.php", $options, get_string('continue'));
597         echo "</td>\n";
598         echo "</tr>\n";
599         echo "</table>\n";
601         echo "<hr />\n";
602         echo "<div style=\"text-align: ".fix_align_rtl("left")."\">\n";
603         echo "<pre>\n";
604         p($INSTALL['config']);
605         echo "</pre>\n";
606         echo "</div>\n";
607     }
608 } else {
609     $formaction = (isset($_GET['configfile'])) ? "install.php?configfile=".$_GET['configfile'] : "install.php";
610     form_table($nextstage, $formaction, $databases);
613 ?>
615         </td>
616     </tr>
617 </table>
619 <?php
621 ?>
623 </body>
624 </html>
635 <?php
638 //==========================================================================//
640 function form_table($nextstage, $formaction, $databases) {
641     global $INSTALL, $DB;
643     $enablenext = true;
645     /// Print the standard form if we aren't in the DOWNLOADLANG page
646     /// because it has its own form.
647     if ($nextstage != DOWNLOADLANG) {
648         $needtoopenform = false;
649 ?>
650         <form id="installform" method="post" action="<?php echo $formaction ?>">
651         <div><input type="hidden" name="stage" value="<?php echo $nextstage ?>" /></div>
653 <?php
654     } else {
655         $needtoopenform = true;
656     }
657 ?>
658     <table class="install_table" cellspacing="3" cellpadding="3">
660 <?php
661     /// what we do depends on the stage we're at
662     switch ($nextstage) {
663         case WELCOME: /// Welcome and language settings
664 ?>
665             <tr>
666                 <td class="td_left"><p class="p_install"><?php print_string('language') ?></p></td>
667                 <td class="td_right">
668                 <?php choose_from_menu (get_installer_list_of_languages(), 'language', $INSTALL['language'], '') ?>
669                 </td>
670             </tr>
672 <?php
673             break;
674         case COMPATIBILITY: /// Compatibilty check
675             $compatsuccess = true;
677             /// Check that PHP is of a sufficient version
678             print_compatibility_row(inst_check_php_version(), get_string('phpversion', 'install'), get_string('php52versionerror', 'install'), 'php52versionhelp');
679             $enablenext = $enablenext && inst_check_php_version();
680             /// Check session auto start
681             print_compatibility_row(!ini_get_bool('session.auto_start'), get_string('sessionautostart', 'install'), get_string('sessionautostarterror', 'install'), 'sessionautostarthelp');
682             $enablenext = $enablenext && !ini_get_bool('session.auto_start');
683             /// Check magic quotes
684             print_compatibility_row(!ini_get_bool('magic_quotes_runtime'), get_string('magicquotesruntime', 'install'), get_string('magicquotesruntimeerror', 'install'), 'magicquotesruntimehelp');
685             $enablenext = $enablenext && !ini_get_bool('magic_quotes_runtime');
686             /// Check unsupported PHP configuration
687             print_compatibility_row(!ini_get_bool('register_globals'), get_string('globalsquotes', 'install'), get_string('globalswarning', 'install'));
688             $enablenext = $enablenext && !ini_get_bool('register_globals');
689             /// Check safe mode
690             print_compatibility_row(!ini_get_bool('safe_mode'), get_string('safemode', 'install'), get_string('safemodeerror', 'install'), 'safemodehelp', true);
691             /// Check file uploads
692             print_compatibility_row(ini_get_bool('file_uploads'), get_string('fileuploads', 'install'), get_string('fileuploadserror', 'install'), 'fileuploadshelp', true);
693             /// Check GD version
694             print_compatibility_row(check_gd_version(), get_string('gdversion', 'install'), get_string('gdversionerror', 'install'), 'gdversionhelp', true);
695             /// Check memory limit
696             print_compatibility_row(check_memory_limit(), get_string('memorylimit', 'install'), get_string('memorylimiterror', 'install'), 'memorylimithelp', true);
699             break;
700         case DIRECTORY: /// Directory settings
701 ?>
703             <tr>
704                 <td class="td_left"><p class="p_install"><?php print_string('wwwroot', 'install') ?></p></td>
705                 <td class="td_right">
706                     <input type="text" size="40"name="wwwrootform" value="<?php p($INSTALL['wwwrootform'],true) ?>" />
707                 </td>
708             </tr>
709             <tr>
710                 <td class="td_left"><p class="p_install"><?php print_string('dirroot', 'install') ?></p></td>
711                 <td class="td_right">
712                     <input type="text" size="40" name="dirrootform" disabled="disabled" value="<?php p($INSTALL['dirrootform'],true) ?>" />
713                 </td>
714             </tr>
715             <tr>
716                 <td class="td_left"><p class="p_install"><?php print_string('dataroot', 'install') ?></p></td>
717                 <td class="td_right">
718                     <input type="text" size="40" name="dataroot" value="<?php p($INSTALL['dataroot'],true) ?>" />
719                 </td>
720             </tr>
722 <?php
723             break;
724         case DATABASE: /// Database settings
725 ?>
727             <tr>
728                 <td class="td_left"><p class="p_install"><?php print_string('dbtype', 'install') ?></p></td>
729                 <td class="td_right">
731                 <?php
733             $options = array ();
734             foreach ($databases as $type => $database) {
735                 $name = $database->get_name();
736                 if ($database->driver_installed() !== true) {
737                     $name = "$name - driver not installed"; // TODO: improve missing driver notification
738                 }
739                 $options[$type] = $name;
740             }
741             choose_from_menu($options, 'dbtype', $INSTALL['dbtype'], '', 'toggledbinfo();')
742 ?>
743                 </td>
744             </tr>
745             <tr>
746                 <td class="td_left"><p class="p_install"><?php print_string('dbhost', 'install') ?></p></td>
747                 <td class="td_right">
748                     <input type="text" class="input_database" name="dbhost" value="<?php p($INSTALL['dbhost']) ?>" />
749                 </td>
750             </tr>
751             <tr>
752                 <td class="td_left"><p class="p_install"><?php print_string('database', 'install') ?></p></td>
753                 <td class="td_right">
754                     <input type="text" class="input_database" name="dbname" value="<?php p($INSTALL['dbname']) ?>" />
755                 </td>
756             </tr>
757             <tr>
758                 <td class="td_left"><p class="p_install"><?php print_string('user') ?></p></td>
759                 <td class="td_right">
760                     <input type="text" class="input_database" name="dbuser" value="<?php p($INSTALL['dbuser']) ?>" />
761                 </td>
762             </tr>
763             <tr>
764                 <td class="td_left"><p class="p_install"><?php print_string('password') ?></p></td>
765                 <td class="td_right">
766                     <input type="password" class="input_database" name="dbpass" value="<?php p($INSTALL['dbpass']) ?>" />
767                 </td>
768             </tr>
769             <tr>
770                 <td class="td_left"><p class="p_install"><?php print_string('dbprefix', 'install') ?></p></td>
771                 <td class="td_right">
772                     <input type="text" class="input_database" name="prefix" value="<?php p($INSTALL['prefix']) ?>" />
773                 </td>
774             </tr>
776 <?php
777             break;
778         case ADMIN: /// Administration directory setting
779 ?>
781             <tr>
782                 <td class="td_left"><p class="p_install"><?php print_string('admindirname', 'install') ?></p></td>
783                 <td class="td_right">
784                     <input type="text" size="40" name="admindirname" value="<?php p($INSTALL['admindirname']) ?>" />
785                 </td>
786             </tr>
789 <?php
790             break;
791         case ENVIRONMENT: /// Environment checks
792 ?>
794             <tr>
795                 <td colspan="2">
796                 <?php
797                     error_reporting(0);  // Hide errors
798                     $dbconnected = $DB->connect($INSTALL['dbhost'],$INSTALL['dbuser'],$INSTALL['dbpass'],$INSTALL['dbname'], $INSTALL['prefix']);
799                     error_reporting(38911);  // Show errors
800                     if ($dbconnected) {
801                     /// Execute environment check, printing results
802                         check_moodle_environment($INSTALL['release'], $environment_results, true);
803                     } else {
804                     /// We never should reach this because DB has been tested before arriving here
805                         $errormsg = get_string('dbconnectionerror', 'install');
806                         $nextstage = DATABASE;
807                         echo '<p class="errormsg" style="text-align:center">'.get_string('dbconnectionerror', 'install').'</p>';
808                     }
809                 ?>
810                 </td>
811             </tr>
813 <?php
814             break;
815         case DOWNLOADLANG: /// Download language from download.moodle.org
816 ?>
818             <tr>
819                 <td colspan="2">
820                 <?php
821                 /// Get array of languages, we are going to use it
822                     $languages=get_installer_list_of_languages();
823                 /// Print the download form (button) if necessary
824                     if ($INSTALL['showdownloadlangpack'] == true && substr($INSTALL['language'],0,2) != 'en') {
825                         $options = array();
826                         $options['downloadlangpack'] = true;
827                         $options['stage'] = DOWNLOADLANG;
828                         $options['same'] = true;
829                         print_simple_box_start('center');
830                         print_single_button('install.php', $options, get_string('downloadlanguagebutton','install', $languages[$INSTALL['language']]), 'post');
831                         print_simple_box_end();
832                     } else {
833                 /// Show result info
834                     /// English lang packs aren't downloaded
835                         if (substr($INSTALL['language'],0,2) == 'en') {
836                             print_simple_box(get_string('downloadlanguagenotneeded', 'install', $languages[$INSTALL['language']]), 'center', '80%');
837                         } else {
838                             if ($INSTALL['downloadlangpackerror']) {
839                                 echo "<p class=\"errormsg\" align=\"center\">".$INSTALL['downloadlangpackerror']."</p>\n";
840                                 print_simple_box(get_string('langdownloaderror', 'install', $languages[$INSTALL['language']]), 'center', '80%');
841                             } else {
842                                 print_simple_box(get_string('langdownloadok', 'install', $languages[$INSTALL['language']]), 'center', '80%');
843                             }
844                         }
845                     }
846                 ?>
847                 </td>
848             </tr>
850 <?php
851             break;
852         default:
853     }
854 ?>
856     <tr>
857         <td colspan="<?php echo ($nextstage == COMPATIBILITY) ? 3 : 2; ?>">
859 <?php
860     if ($needtoopenform) {
861 ?>
862             <form id="installform" method="post" action="<?php echo $formaction ?>">
863             <div><input type="hidden" name="stage" value="<?php echo $nextstage ?>" /></div>
864 <?php
865     }
867     $disabled = $enablenext ? '' : 'disabled="disabled"';
868 ?>
870             <?php echo ($nextstage < SAVE) ? "<div><input $disabled type=\"submit\" name=\"next\" value=\"".get_string('next')."  &raquo;\" style=\"float: ".fix_align_rtl("right")."\"/></div>\n" : "&nbsp;\n" ?>
871             <?php echo ($nextstage > WELCOME) ? "<div><input type=\"submit\" name=\"prev\" value=\"&laquo;  ".get_string('previous')."\" style=\"float: ".fix_align_rtl("left")."\"/></div>\n" : "&nbsp;\n" ?>
873 <?php
874     if ($needtoopenform) {
875 ?>
876             </form>
877 <?php
878     }
879 ?>
882         </td>
884     </tr>
886     </table>
887 <?php
888     if (!$needtoopenform) {
889 ?>
890     </form>
891 <?php
892     }
893 ?>
895 <?php
900 //==========================================================================//
902 function print_compatibility_row($success, $testtext, $errormessage, $helpfield='', $caution=false) {
903     echo "<tr>\n";
904     echo "<td class=\"td_left_nowrap\" valign=\"top\"><p class=\"p_install\">$testtext</p></td>\n";
905     if ($success) {
906         echo "<td valign=\"top\"><p class=\"p_pass\">".get_string('pass', 'install')."</p></td>\n";
907         echo "<td valign=\"top\">&nbsp;</td>\n";
908     } else {
909         echo "<td valign=\"top\">";
910         echo ($caution) ? "<p class=\"p_caution\">".get_string('caution', 'install') : "<p class=\"p_fail\">".get_string('fail', 'install');
911         echo "</p></td>\n";
912         echo "<td valign=\"top\">";
913         echo "<p class=\"p_install\">$errormessage ";
914         if ($helpfield !== '') {
915             install_helpbutton("install.php?help=$helpfield");
916         }
917         echo "</p></td>\n";
918     }
919     echo "</tr>\n";
920     return $success;
924 //==========================================================================//
926 function install_helpbutton($url, $title='') {
927     if ($title == '') {
928         $title = get_string('help');
929     }
930     echo "<a href=\"javascript:void(0)\" ";
931     echo "onclick=\"return window.open('$url','Help','menubar=0,location=0,scrollbars,resizable,width=500,height=400')\"";
932     echo ">";
933     echo "<img src=\"pix/help.gif\" class=\"iconhelp\" alt=\"$title\" title=\"$title\"/>";
934     echo "</a>\n";
939 //==========================================================================//
941 function print_install_help($help) {
942     switch ($help) {
943         case 'phpversionhelp':
944             print_string($help, 'install', phpversion());
945             break;
946         case 'memorylimithelp':
947             print_string($help, 'install', get_memory_limit());
948             break;
949         default:
950             print_string($help, 'install');
951     }
954 //==========================================================================//
956 function css_styles($databases) {
957 ?>
959 <style type="text/css">
961     body { background-color: #ffeece; }
962     p, li, td {
963         font-family: helvetica, arial, sans-serif;
964         font-size: 10pt;
965     }
966     a { text-decoration: none; color: blue; }
967     a img {
968         border: none;
969     }
970     .errormsg {
971         color: red;
972         font-weight: bold;
973     }
974     blockquote {
975         font-family: courier, monospace;
976         font-size: 10pt;
977     }
978     .input_database {
979         width: 270px;
980     }
981     .install_table {
982         width: 500px;
983         margin-left:auto;
984         margin-right:auto;
985     }
986     .td_left {
987         text-align: <?php echo fix_align_rtl("right") ?>;
988         font-weight: bold;
989     }
990     .td_left_nowrap{
991         text-align: <?php echo fix_align_rtl("right") ?>;
992         font-weight: bold;
993         white-space: nowrap;
994         width: 160px;
995         padding-left: 10px;
996     }
997     .td_right {
998         text-align: <?php echo fix_align_rtl("left") ?>;
999     }
1000     .main {
1001         width: 80%;
1002         border-width: 1px;
1003         border-style: solid;
1004         border-color: #ffc85f;
1005         margin-left:auto;
1006         margin-right:auto;
1007         -moz-border-radius-bottomleft: 15px;
1008         -moz-border-radius-bottomright: 15px;
1009     }
1010     .td_mainheading {
1011         background-color: #fee6b9;
1012         padding-left: 10px;
1013     }
1014     .td_main {
1015         text-align: center;
1016     }
1017     .td_mainlogo {
1018         vertical-align: middle;
1019     }
1020     .p_mainlogo {
1021         margin-top: 0px;
1022         margin-bottom: 0px;
1023     }
1024     .p_mainheading {
1025         font-size: 11pt;
1026         margin-top: 16px;
1027         margin-bottom: 16px;
1028     }
1029     .p_subheading {
1030         font-size: 10pt;
1031         padding-left: 10px;
1032         margin-top: 16px;
1033         margin-bottom: 16px;
1034     }
1035     .p_mainheader{
1036         text-align: right;
1037         font-size: 20pt;
1038         font-weight: bold;
1039         margin-top: 0px;
1040         margin-bottom: 0px;
1041     }
1042     .p_pass {
1043         color: green;
1044         font-weight: bold;
1045         margin-top: 0px;
1046         margin-bottom: 0px;
1047     }
1048     .p_fail {
1049         color: red;
1050         font-weight: bold;
1051         margin-top: 0px;
1052         margin-bottom: 0px;
1053     }
1054     .p_caution {
1055         color: #ff6600;
1056         font-weight: bold;
1057         margin-top: 0px;
1058         margin-bottom: 0px;
1059     }
1060     .p_help {
1061         text-align: center;
1062         font-family: helvetica, arial, sans-serif;
1063         font-size: 14pt;
1064         font-weight: bold;
1065         color: #333333;
1066         margin-top: 0px;
1067         margin-bottom: 0px;
1068     }
1069     /* This override the p tag for every p tag in this installation script,
1070        but not in lang\xxx\installer.php
1071       */
1072     .p_install {
1073         margin-top: 0px;
1074         margin-bottom: 0px;
1075     }
1076     .environmenttable {
1077         font-size: 10pt;
1078         border-color: #ffc85f;
1079     }
1080     table.environmenttable .error {
1081         background-color : red;
1082         color : inherit;
1083     }
1085     table.environmenttable .warn {
1086         background-color : yellow;
1087     }
1089     table.environmenttable .ok {
1090         background-color : lightgreen;
1091     }
1092     .header {
1093         background-color: #fee6b9;
1094         font-size: 10pt;
1095     }
1096     .cell {
1097         background-color: #ffeece;
1098         font-size: 10pt;
1099     }
1100     .error {
1101         color: #ff0000;
1102     }
1103     .errorboxcontent {
1104         text-align: center;
1105         font-weight: bold;
1106         padding-left: 20px;
1107         color: #ff0000;
1108     }
1109     .invisiblefieldset {
1110       display:inline;
1111       border:0px;
1112       padding:0px;
1113       margin:0px;
1114     }
1115     <?php
1116         $list = array();
1117         foreach ($databases as $driver=>$unused) {
1118             $list[] = '#'.$driver;
1119         }
1120         $list = implode(',', $list);
1121         echo ($list);
1122     ?> {
1123         display: none;
1124     }
1126 </style>
1128 <?php
1131 //==========================================================================//
1133 function database_js($databases) {
1134 ?>
1136 <script type="text/javascript" defer="defer">
1137 function toggledbinfo() {
1138     //Calculate selected value
1139     var showid = 'mysql';
1140     if (document.getElementById('installform').dbtype.value) {
1141         showid = document.getElementById('installform').dbtype.value;
1142     }
1143     if (document.getElementById) {
1144         //Hide all the divs
1145     <?php
1146         $list = array();
1147         foreach ($databases as $driver=>$unused) {
1148             echo "document.getElementById('$driver').style.display = '';";
1149         }
1150     ?>
1151         //Show the selected div
1152         document.getElementById(showid).style.display = 'block';
1153     } else if (document.all) {
1154         //This is the way old msie versions work
1155         //Hide all the divs
1156     <?php
1157         $list = array();
1158         foreach ($databases as $driver=>$unused) {
1159             echo "document.all['$driver'].style.display = '';";
1160         }
1161     ?>
1162         //Show the selected div
1163         document.all[showid].style.display = 'block';
1164     } else if (document.layers) {
1165         //This is the way nn4 works
1166         //Hide all the divs
1167     <?php
1168         $list = array();
1169         foreach ($databases as $driver=>$unused) {
1170             echo "document.layers['$driver'].style.display = '';";
1171         }
1172     ?>
1173         //Show the selected div
1174         document.layers[showid].style.display = 'block';
1175     }
1177 </script>
1179 <?php
1182 ?>