Same name and namespace in other branches
  1. 7.x includes/install.core.inc \install_tasks()
  2. 8.9.x core/includes/install.core.inc \install_tasks()
  3. 9 core/includes/install.core.inc \install_tasks()

Tasks performed after the database is initialized.

1 call to install_tasks()
install_main in ./install.php
The Drupal installation happens in a series of steps. We begin by verifying that the current environment meets our minimum requirements. We then go on to verify that settings.php is properly configured. From there we connect to the configured database…

File

./install.php, line 646

Code

function install_tasks($profile, $task) {
  global $base_url, $install_locale;

  // Bootstrap newly installed Drupal, while preserving existing messages.
  $messages = isset($_SESSION['messages']) ? $_SESSION['messages'] : '';
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
  $_SESSION['messages'] = $messages;

  // URL used to direct page requests.
  $url = $base_url . '/install.php?locale=' . $install_locale . '&profile=' . $profile;

  // Build a page for final tasks.
  if (empty($task)) {
    variable_set('install_task', 'profile-install');
    $task = 'profile-install';
  }

  // We are using a list of if constructs here to allow for
  // passing from one task to the other in the same request.
  // Install profile modules.
  if ($task == 'profile-install') {
    $modules = variable_get('install_profile_modules', array());
    $files = module_rebuild_cache();
    variable_del('install_profile_modules');
    $operations = array();
    foreach ($modules as $module) {
      $operations[] = array(
        '_install_module_batch',
        array(
          $module,
          $files[$module]->info['name'],
        ),
      );
    }
    $batch = array(
      'operations' => $operations,
      'finished' => '_install_profile_batch_finished',
      'title' => st('Installing @drupal', array(
        '@drupal' => drupal_install_profile_name(),
      )),
      'error_message' => st('The installation has encountered an error.'),
    );

    // Start a batch, switch to 'profile-install-batch' task. We need to
    // set the variable here, because batch_process() redirects.
    variable_set('install_task', 'profile-install-batch');
    batch_set($batch);
    batch_process($url, $url);
  }

  // We are running a batch install of the profile's modules.
  // This might run in multiple HTTP requests, constantly redirecting
  // to the same address, until the batch finished callback is invoked
  // and the task advances to 'locale-initial-import'.
  if ($task == 'profile-install-batch') {
    include_once 'includes/batch.inc';
    $output = _batch_page();
  }

  // Import interface translations for the enabled modules.
  if ($task == 'locale-initial-import') {
    if (!empty($install_locale) && $install_locale != 'en') {
      include_once 'includes/locale.inc';

      // Enable installation language as default site language.
      locale_add_language($install_locale, NULL, NULL, NULL, NULL, NULL, 1, TRUE);

      // Collect files to import for this language.
      $batch = locale_batch_by_language($install_locale, '_install_locale_initial_batch_finished');
      if (!empty($batch)) {

        // Remember components we cover in this batch set.
        variable_set('install_locale_batch_components', $batch['#components']);

        // Start a batch, switch to 'locale-batch' task. We need to
        // set the variable here, because batch_process() redirects.
        variable_set('install_task', 'locale-initial-batch');
        batch_set($batch);
        batch_process($url, $url);
      }
    }

    // Found nothing to import or not foreign language, go to next task.
    $task = 'configure';
  }
  if ($task == 'locale-initial-batch') {
    include_once 'includes/batch.inc';
    include_once 'includes/locale.inc';
    $output = _batch_page();
  }
  if ($task == 'configure') {
    if (variable_get('site_name', FALSE) || variable_get('site_mail', FALSE)) {

      // Site already configured: This should never happen, means re-running
      // the installer, possibly by an attacker after the 'install_task' variable
      // got accidentally blown somewhere. Stop it now.
      install_already_done_error();
    }
    $form = drupal_get_form('install_configure_form', $url);
    if (!variable_get('site_name', FALSE) && !variable_get('site_mail', FALSE)) {

      // Not submitted yet: Prepare to display the form.
      $output = $form;
      drupal_set_title(st('Configure site'));

      // Warn about settings.php permissions risk
      $settings_dir = './' . conf_path();
      $settings_file = $settings_dir . '/settings.php';
      if (!drupal_verify_install_file($settings_file, FILE_EXIST | FILE_READABLE | FILE_NOT_WRITABLE) || !drupal_verify_install_file($settings_dir, FILE_NOT_WRITABLE, 'dir')) {
        drupal_set_message(st('All necessary changes to %dir and %file have been made, so you should remove write permissions to them now in order to avoid security risks. If you are unsure how to do so, please consult the <a href="@handbook_url">on-line handbook</a>.', array(
          '%dir' => $settings_dir,
          '%file' => $settings_file,
          '@handbook_url' => 'http://drupal.org/getting-started',
        )), 'error');
      }
      else {
        drupal_set_message(st('All necessary changes to %dir and %file have been made. They have been set to read-only for security.', array(
          '%dir' => $settings_dir,
          '%file' => $settings_file,
        )));
      }

      // Add JavaScript validation.
      _user_password_dynamic_validation();
      drupal_add_js(drupal_get_path('module', 'system') . '/system.js', 'module');

      // We add these strings as settings because JavaScript translation does not
      // work on install time.
      drupal_add_js(array(
        'copyFieldValue' => array(
          'edit-site-mail' => array(
            'edit-account-mail',
          ),
        ),
        'cleanURL' => array(
          'success' => st('Your server has been successfully tested to support this feature.'),
          'failure' => st('Your system configuration does not currently support this feature. The <a href="http://drupal.org/node/15365">handbook page on Clean URLs</a> has additional troubleshooting information.'),
          'testing' => st('Testing clean URLs...'),
        ),
      ), 'setting');
      drupal_add_js('
// Global Killswitch
if (Drupal.jsEnabled) {
  $(document).ready(function() {
    Drupal.cleanURLsInstallCheck();
    Drupal.setDefaultTimezone();
  });
}', 'inline');

      // Build menu to allow clean URL check.
      menu_rebuild();
    }
    else {
      $task = 'profile';
    }
  }

  // If found an unknown task or the 'profile' task, which is
  // reserved for profiles, hand over the control to the profile,
  // so it can run any number of custom tasks it defines.
  if (!in_array($task, install_reserved_tasks())) {
    $function = $profile . '_profile_tasks';
    if (function_exists($function)) {

      // The profile needs to run more code, maybe even more tasks.
      // $task is sent through as a reference and may be changed!
      $output = $function($task, $url);
    }

    // If the profile doesn't move on to a new task we assume
    // that it is done.
    if ($task == 'profile') {
      $task = 'profile-finished';
    }
  }

  // Profile custom tasks are done, so let the installer regain
  // control and proceed with importing the remaining translations.
  if ($task == 'profile-finished') {
    if (!empty($install_locale) && $install_locale != 'en') {
      include_once 'includes/locale.inc';

      // Collect files to import for this language. Skip components
      // already covered in the initial batch set.
      $batch = locale_batch_by_language($install_locale, '_install_locale_remaining_batch_finished', variable_get('install_locale_batch_components', array()));

      // Remove temporary variable.
      variable_del('install_locale_batch_components');
      if (!empty($batch)) {

        // Start a batch, switch to 'locale-remaining-batch' task. We need to
        // set the variable here, because batch_process() redirects.
        variable_set('install_task', 'locale-remaining-batch');
        batch_set($batch);
        batch_process($url, $url);
      }
    }

    // Found nothing to import or not foreign language, go to next task.
    $task = 'finished';
  }
  if ($task == 'locale-remaining-batch') {
    include_once 'includes/batch.inc';
    include_once 'includes/locale.inc';
    $output = _batch_page();
  }

  // Display a 'finished' page to user.
  if ($task == 'finished') {
    drupal_set_title(st('@drupal installation complete', array(
      '@drupal' => drupal_install_profile_name(),
    )));
    $messages = drupal_set_message();
    $output = '<p>' . st('Congratulations, @drupal has been successfully installed.', array(
      '@drupal' => drupal_install_profile_name(),
    )) . '</p>';
    $output .= '<p>' . (isset($messages['error']) ? st('Please review the messages above before continuing on to <a href="@url">your new site</a>.', array(
      '@url' => url(''),
    )) : st('You may now visit <a href="@url">your new site</a>.', array(
      '@url' => url(''),
    ))) . '</p>';
    $task = 'done';
  }

  // The end of the install process. Remember profile used.
  if ($task == 'done') {

    // Rebuild menu to get content type links registered by the profile,
    // and possibly any other menu items created through the tasks.
    menu_rebuild();

    // Register actions declared by any modules.
    actions_synchronize();

    // Randomize query-strings on css/js files, to hide the fact that
    // this is a new install, not upgraded yet.
    _drupal_flush_css_js();
    variable_set('install_profile', $profile);
  }

  // Set task for user, and remember the task in the database.
  install_task_list($task);
  variable_set('install_task', $task);

  // Output page, if some output was required. Otherwise it is possible
  // that we are printing a JSON page and theme output should not be there.
  if (isset($output)) {
    print theme('maintenance_page', $output);
  }
}