#190283 by JirkaRybka and myself: fix installer localization and form handling
- use a two pass localization process so localization is ready for the configure form and profile tasks - fix awkward form API workarounds which were introduced before we used a full bootstrap anyway - allow for more usable localized profiles by letting them skip language selection - lots of documentation improvements to profiles and the installer functions6.x
							parent
							
								
									c0994a3a4e
								
							
						
					
					
						commit
						04ca1b4676
					
				| 
						 | 
					@ -2416,22 +2416,31 @@ function _locale_get_predefined_list() {
 | 
				
			||||||
 *   Language code to import translations for.
 | 
					 *   Language code to import translations for.
 | 
				
			||||||
 * @param $finished
 | 
					 * @param $finished
 | 
				
			||||||
 *   Optional finished callback for the batch.
 | 
					 *   Optional finished callback for the batch.
 | 
				
			||||||
 | 
					 * @param $skip
 | 
				
			||||||
 | 
					 *   Array of component names to skip. Used in the installer for the
 | 
				
			||||||
 | 
					 *   second pass import, when most components are already imported.
 | 
				
			||||||
 * @return
 | 
					 * @return
 | 
				
			||||||
 *   A batch structure or FALSE if no files found.
 | 
					 *   A batch structure or FALSE if no files found.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function locale_batch_by_language($langcode, $finished = '_locale_batch_installer_finished') {
 | 
					function locale_batch_by_language($langcode, $finished = NULL, $skip = array()) {
 | 
				
			||||||
  // Collect all files to import for all enabled modules and themes.
 | 
					  // Collect all files to import for all enabled modules and themes.
 | 
				
			||||||
  $files = array();
 | 
					  $files = array();
 | 
				
			||||||
  $result = db_query("SELECT name, filename FROM {system} WHERE status = 1");
 | 
					  $components = array();
 | 
				
			||||||
 | 
					  $query = "SELECT name, filename FROM {system} WHERE status = 1";
 | 
				
			||||||
 | 
					  if (count($skip)) {
 | 
				
			||||||
 | 
					    $query .= " AND name NOT IN (". db_placeholders($skip, 'varchar') .")"; 
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  $result = db_query($query, $skip);
 | 
				
			||||||
  while ($component = db_fetch_object($result)) {
 | 
					  while ($component = db_fetch_object($result)) {
 | 
				
			||||||
    // Collect all files for all components, names as $langcode.po or
 | 
					    // Collect all files for all components, names as $langcode.po or
 | 
				
			||||||
    // with names ending with $langcode.po. This allows for filenames
 | 
					    // with names ending with $langcode.po. This allows for filenames
 | 
				
			||||||
    // like node-module.de.po to let translators use small files and
 | 
					    // like node-module.de.po to let translators use small files and
 | 
				
			||||||
    // be able to import in smaller chunks.
 | 
					    // be able to import in smaller chunks.
 | 
				
			||||||
    $files = array_merge($files, file_scan_directory(dirname($component->filename) .'/translations', '(^|\.)'. $langcode .'\.po$', array('.', '..', 'CVS'), 0, FALSE));
 | 
					    $files = array_merge($files, file_scan_directory(dirname($component->filename) .'/translations', '(^|\.)'. $langcode .'\.po$', array('.', '..', 'CVS'), 0, FALSE));
 | 
				
			||||||
 | 
					    $components[] = $component->name;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return _locale_batch_build($files, $finished);
 | 
					  return _locale_batch_build($files, $finished, $components);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -2474,10 +2483,12 @@ function locale_batch_by_component($components, $finished = '_locale_batch_syste
 | 
				
			||||||
 *   Array of files to import
 | 
					 *   Array of files to import
 | 
				
			||||||
 * @param $finished
 | 
					 * @param $finished
 | 
				
			||||||
 *   Optional finished callback for the batch.
 | 
					 *   Optional finished callback for the batch.
 | 
				
			||||||
 | 
					 * @param $components
 | 
				
			||||||
 | 
					 *   Optional list of component names the batch covers. Used in the installer.
 | 
				
			||||||
 * @return
 | 
					 * @return
 | 
				
			||||||
 *   A batch structure
 | 
					 *   A batch structure
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function _locale_batch_build($files, $finished = NULL) {
 | 
					function _locale_batch_build($files, $finished = NULL, $components = array()) {
 | 
				
			||||||
  $t = get_t();
 | 
					  $t = get_t();
 | 
				
			||||||
  if (count($files)) {
 | 
					  if (count($files)) {
 | 
				
			||||||
    $operations = array();
 | 
					    $operations = array();
 | 
				
			||||||
| 
						 | 
					@ -2490,6 +2501,9 @@ function _locale_batch_build($files, $finished = NULL) {
 | 
				
			||||||
        'init_message'  => $t('Starting import'),
 | 
					        'init_message'  => $t('Starting import'),
 | 
				
			||||||
        'error_message' => $t('Error importing interface translations'),
 | 
					        'error_message' => $t('Error importing interface translations'),
 | 
				
			||||||
        'file'          => './includes/locale.inc',
 | 
					        'file'          => './includes/locale.inc',
 | 
				
			||||||
 | 
					        // This is not a batch API construct, but data passed along to the
 | 
				
			||||||
 | 
					        // installer, so we know what did we import already.
 | 
				
			||||||
 | 
					        '#components'   => $components,
 | 
				
			||||||
      );
 | 
					      );
 | 
				
			||||||
      if (isset($finished)) {
 | 
					      if (isset($finished)) {
 | 
				
			||||||
        $batch['finished'] = $finished;
 | 
					        $batch['finished'] = $finished;
 | 
				
			||||||
| 
						 | 
					@ -2537,14 +2551,6 @@ function _locale_batch_language_finished($success, $results) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Finished callback of installer locale import batch.
 | 
					 | 
				
			||||||
 * Advance installer task to the finished screen.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
function _locale_batch_installer_finished($success, $results) {
 | 
					 | 
				
			||||||
  variable_set('install_task', 'finished');
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * @} End of "locale-autoimport"
 | 
					 * @} End of "locale-autoimport"
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										211
									
								
								install.php
								
								
								
								
							
							
						
						
									
										211
									
								
								install.php
								
								
								
								
							| 
						 | 
					@ -27,6 +27,9 @@ function install_main() {
 | 
				
			||||||
  // Ensure correct page headers are sent (e.g. caching)
 | 
					  // Ensure correct page headers are sent (e.g. caching)
 | 
				
			||||||
  drupal_page_header();
 | 
					  drupal_page_header();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Set up $language, so t() caller functions will still work.
 | 
				
			||||||
 | 
					  drupal_init_language();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Check existing settings.php.
 | 
					  // Check existing settings.php.
 | 
				
			||||||
  $verify = install_verify_settings();
 | 
					  $verify = install_verify_settings();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -448,6 +451,9 @@ function install_select_profile() {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Form API array definition for the profile selection form.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
function install_select_profile_form(&$form_state, $profiles) {
 | 
					function install_select_profile_form(&$form_state, $profiles) {
 | 
				
			||||||
  foreach ($profiles as $profile) {
 | 
					  foreach ($profiles as $profile) {
 | 
				
			||||||
    include_once($profile->filename);
 | 
					    include_once($profile->filename);
 | 
				
			||||||
| 
						 | 
					@ -525,6 +531,19 @@ function install_select_locale($profilename) {
 | 
				
			||||||
    return FALSE;
 | 
					    return FALSE;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else {
 | 
					  else {
 | 
				
			||||||
 | 
					    // Allow profile to pre-select the language, skipping the selection.
 | 
				
			||||||
 | 
					    $function = $profilename .'_profile_details';
 | 
				
			||||||
 | 
					    if (function_exists($function)) {
 | 
				
			||||||
 | 
					      $details = $function();
 | 
				
			||||||
 | 
					      if (isset($details['language'])) {
 | 
				
			||||||
 | 
					        foreach ($locales as $locale) {
 | 
				
			||||||
 | 
					          if ($details['language'] == $locale->name) {
 | 
				
			||||||
 | 
					            return $locale->name;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    foreach ($locales as $locale) {
 | 
					    foreach ($locales as $locale) {
 | 
				
			||||||
      if ($_POST['locale'] == $locale->name) {
 | 
					      if ($_POST['locale'] == $locale->name) {
 | 
				
			||||||
        return $locale->name;
 | 
					        return $locale->name;
 | 
				
			||||||
| 
						 | 
					@ -540,6 +559,9 @@ function install_select_locale($profilename) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Form API array definition for language selection.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
function install_select_locale_form(&$form_state, $locales) {
 | 
					function install_select_locale_form(&$form_state, $locales) {
 | 
				
			||||||
  include_once './includes/locale.inc';
 | 
					  include_once './includes/locale.inc';
 | 
				
			||||||
  $languages = _locale_get_predefined_list();
 | 
					  $languages = _locale_get_predefined_list();
 | 
				
			||||||
| 
						 | 
					@ -589,7 +611,7 @@ function install_already_done_error() {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Tasks performed after the database is initialized. Called from install.php.
 | 
					 * Tasks performed after the database is initialized.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function install_tasks($profile, $task) {
 | 
					function install_tasks($profile, $task) {
 | 
				
			||||||
  global $base_url, $install_locale;
 | 
					  global $base_url, $install_locale;
 | 
				
			||||||
| 
						 | 
					@ -599,40 +621,66 @@ function install_tasks($profile, $task) {
 | 
				
			||||||
  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 | 
					  drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 | 
				
			||||||
  $_SESSION['messages'] = $messages;
 | 
					  $_SESSION['messages'] = $messages;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Build a page for a final task.
 | 
					  // URL used to direct page requests.
 | 
				
			||||||
 | 
					  $url = $base_url .'/install.php?locale='. $install_locale .'&profile='. $profile;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Build a page for final tasks.
 | 
				
			||||||
  drupal_maintenance_theme();
 | 
					  drupal_maintenance_theme();
 | 
				
			||||||
  if (empty($task)) {
 | 
					  if (empty($task)) {
 | 
				
			||||||
    variable_set('install_task', 'configure');
 | 
					    variable_set('install_task', 'locale-initial-import');
 | 
				
			||||||
    $task = 'configure';
 | 
					    $task = 'locale-initial-import';
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // We are using a list of if constructs here to allow for
 | 
					  // We are using a list of if constructs here to allow for
 | 
				
			||||||
  // passing from one task to the other in the same request.
 | 
					  // passing from one task to the other in the same request.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // 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';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // We are running a batch import of interface translation files.
 | 
				
			||||||
 | 
					  // 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 'configure'.
 | 
				
			||||||
 | 
					  if ($task == 'locale-initial-batch') {
 | 
				
			||||||
 | 
					    include_once 'includes/batch.inc';
 | 
				
			||||||
 | 
					    include_once 'includes/locale.inc';
 | 
				
			||||||
 | 
					    $output = _batch_page();
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if ($task == 'configure') {
 | 
					  if ($task == 'configure') {
 | 
				
			||||||
    drupal_set_title(st('Configure site'));
 | 
					    if (variable_get('site_name', FALSE) || variable_get('site_mail', FALSE)) {
 | 
				
			||||||
 | 
					      // Site already configured: This should never happen, means re-running
 | 
				
			||||||
    // We break the form up so we can tell when it's been successfully
 | 
					      // the installer, possibly by an attacker after the 'install_task' variable
 | 
				
			||||||
    // submitted.
 | 
					      // got accidentally blown somewhere. Stop it now.
 | 
				
			||||||
 | 
					      install_already_done_error();
 | 
				
			||||||
    $form_state = array('storage' => NULL, 'submitted' => FALSE);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    $form = drupal_retrieve_form('install_configure_form', $form_state);
 | 
					 | 
				
			||||||
    $form_build_id = md5(mt_rand());
 | 
					 | 
				
			||||||
    $form['#build_id'] = $form_build_id;
 | 
					 | 
				
			||||||
    drupal_prepare_form('install_configure_form', $form, $form_state);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Is the form submitted?
 | 
					 | 
				
			||||||
    if (!empty($_POST) && $_POST['form_id'] == 'install_configure_form') {
 | 
					 | 
				
			||||||
      $form['#post'] = $_POST;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else {
 | 
					 | 
				
			||||||
      $form['#post'] = array();
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    $form = drupal_get_form('install_configure_form', $url);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    drupal_process_form('install_configure_form', $form, $form_state);
 | 
					    if (!variable_get('site_name', FALSE) && !variable_get('site_mail', FALSE)) {
 | 
				
			||||||
    if (empty($form_state['redirect'])) {
 | 
					      // Not submitted yet: Prepare to display the form.
 | 
				
			||||||
      // Add JavaScript validation for form.
 | 
					      $output = $form;
 | 
				
			||||||
 | 
					      drupal_set_title(st('Configure site'));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      // Add JavaScript validation.
 | 
				
			||||||
      _user_password_dynamic_validation();
 | 
					      _user_password_dynamic_validation();
 | 
				
			||||||
      drupal_add_js(drupal_get_path('module', 'system') .'/system.js', 'module');
 | 
					      drupal_add_js(drupal_get_path('module', 'system') .'/system.js', 'module');
 | 
				
			||||||
      // We add these strings as settings because JavaScript translation does not
 | 
					      // We add these strings as settings because JavaScript translation does not
 | 
				
			||||||
| 
						 | 
					@ -646,17 +694,16 @@ if (Drupal.jsEnabled) {
 | 
				
			||||||
    Drupal.setDefaultTimezone();
 | 
					    Drupal.setDefaultTimezone();
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}', 'inline');
 | 
					}', 'inline');
 | 
				
			||||||
 | 
					 | 
				
			||||||
      // Build menu to allow clean URL check.
 | 
					      // Build menu to allow clean URL check.
 | 
				
			||||||
      menu_rebuild();
 | 
					      menu_rebuild();
 | 
				
			||||||
      $output = drupal_render_form('install_configure_form', $form);
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    else {
 | 
					    else {
 | 
				
			||||||
      $task = 'profile';
 | 
					      $task = 'profile';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // If found an unknown task or the 'profile-custom' task, which is
 | 
					  // If found an unknown task or the 'profile' task, which is
 | 
				
			||||||
  // reserved for profiles, hand over the control to the profile,
 | 
					  // reserved for profiles, hand over the control to the profile,
 | 
				
			||||||
  // so it can run any number of custom tasks it defines.
 | 
					  // so it can run any number of custom tasks it defines.
 | 
				
			||||||
  if (!in_array($task, install_reserved_tasks())) {
 | 
					  if (!in_array($task, install_reserved_tasks())) {
 | 
				
			||||||
| 
						 | 
					@ -664,44 +711,38 @@ if (Drupal.jsEnabled) {
 | 
				
			||||||
    if (function_exists($function)) {
 | 
					    if (function_exists($function)) {
 | 
				
			||||||
      // The profile needs to run more code, maybe even more tasks.
 | 
					      // The profile needs to run more code, maybe even more tasks.
 | 
				
			||||||
      // $task is sent through as a reference and may be changed!
 | 
					      // $task is sent through as a reference and may be changed!
 | 
				
			||||||
      $output = $function($task);
 | 
					      $output = $function($task, $url);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // If the profile doesn't move on to a new task we assume
 | 
					    // If the profile doesn't move on to a new task we assume
 | 
				
			||||||
    // that it is done: we let the installer regain control and
 | 
					    // that it is done.
 | 
				
			||||||
    // proceed with the locale import.
 | 
					 | 
				
			||||||
    if ($task == 'profile') {
 | 
					    if ($task == 'profile') {
 | 
				
			||||||
      $task = 'locale-import';
 | 
					      $task = 'profile-finished';
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Import interface translations for the enabled modules, after
 | 
					  // Profile custom tasks are done, so let the installer regain
 | 
				
			||||||
  // any changes made by the profile through the profile forms.
 | 
					  // control and proceed with importing the remaining translations.
 | 
				
			||||||
  if ($task == 'locale-import') {
 | 
					  if ($task == 'profile-finished') {
 | 
				
			||||||
    if (!empty($install_locale) && ($install_locale != 'en')) {
 | 
					    if (!empty($install_locale) && ($install_locale != 'en')) {
 | 
				
			||||||
      include_once 'includes/locale.inc';
 | 
					      include_once 'includes/locale.inc';
 | 
				
			||||||
      // Enable installation language as default site language.
 | 
					      // Collect files to import for this language. Skip components
 | 
				
			||||||
      locale_add_language($install_locale, NULL, NULL, NULL, NULL, NULL, 1, TRUE);
 | 
					      // already covered in the initial batch set.
 | 
				
			||||||
      // Collect files to import for this language.
 | 
					      $batch = locale_batch_by_language($install_locale, '_install_locale_remaining_batch_finished', variable_get('install_locale_batch_components', array()));
 | 
				
			||||||
      $batch = locale_batch_by_language($install_locale);
 | 
					      // Remove temporary variable.
 | 
				
			||||||
 | 
					      variable_del('install_locale_batch_components');
 | 
				
			||||||
      if (!empty($batch)) {
 | 
					      if (!empty($batch)) {
 | 
				
			||||||
        // Start a batch, switch to 'locale-batch' task. We need to
 | 
					        // Start a batch, switch to 'locale-remaining-batch' task. We need to
 | 
				
			||||||
        // set the variable here, because batch_process() redirects.
 | 
					        // set the variable here, because batch_process() redirects.
 | 
				
			||||||
        variable_set('install_task', 'locale-batch');
 | 
					        variable_set('install_task', 'locale-remaining-batch');
 | 
				
			||||||
        batch_set($batch);
 | 
					        batch_set($batch);
 | 
				
			||||||
        $path = $base_url .'/install.php?locale='. $install_locale .'&profile='. $profile;
 | 
					        batch_process($url, $url);
 | 
				
			||||||
        batch_process($path, $path);
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    // Found nothing to import or not foreign language, go to next task.
 | 
					    // Found nothing to import or not foreign language, go to next task.
 | 
				
			||||||
    $task = 'finished';
 | 
					    $task = 'finished';
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  if ($task == 'locale-remaining-batch') {
 | 
				
			||||||
  // We are running a batch import of interface translation files.
 | 
					 | 
				
			||||||
  // 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 'finished'.
 | 
					 | 
				
			||||||
  if ($task == 'locale-batch') {
 | 
					 | 
				
			||||||
    include_once 'includes/batch.inc';
 | 
					    include_once 'includes/batch.inc';
 | 
				
			||||||
    include_once 'includes/locale.inc';
 | 
					    include_once 'includes/locale.inc';
 | 
				
			||||||
    $output = _batch_page();
 | 
					    $output = _batch_page();
 | 
				
			||||||
| 
						 | 
					@ -739,11 +780,29 @@ if (Drupal.jsEnabled) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Finished callback for the first locale import batch.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Advance installer task to the configure screen.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					function _install_locale_initial_batch_finished($success, $results) {
 | 
				
			||||||
 | 
					  variable_set('install_task', 'configure');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Finished callback for the second locale import batch.
 | 
				
			||||||
 | 
					 * 
 | 
				
			||||||
 | 
					 * Advance installer task to the finished screen.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					function _install_locale_remaining_batch_finished($success, $results) {
 | 
				
			||||||
 | 
					  variable_set('install_task', 'finished');
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * The list of reserved tasks to run in the installer.
 | 
					 * The list of reserved tasks to run in the installer.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function install_reserved_tasks() {
 | 
					function install_reserved_tasks() {
 | 
				
			||||||
  return array('configure', 'locale-import', 'locale-batch', 'finished', 'done');
 | 
					  return array('configure', 'locale-initial-import', 'locale-initial-batch', 'profile-finished', 'locale-remaining-batch', 'finished', 'done');
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -799,11 +858,12 @@ function install_check_requirements($profile, $verify) {
 | 
				
			||||||
function install_task_list($active = NULL) {
 | 
					function install_task_list($active = NULL) {
 | 
				
			||||||
  // Default list of tasks.
 | 
					  // Default list of tasks.
 | 
				
			||||||
  $tasks = array(
 | 
					  $tasks = array(
 | 
				
			||||||
    'profile-select' => st('Choose profile'),
 | 
					    'profile-select'       => st('Choose profile'),
 | 
				
			||||||
    'locale-select'  => st('Choose language'),
 | 
					    'locale-select'        => st('Choose language'),
 | 
				
			||||||
    'requirements'   => st('Verify requirements'),
 | 
					    'requirements'         => st('Verify requirements'),
 | 
				
			||||||
    'database'       => st('Setup database'),
 | 
					    'database'             => st('Setup database'),
 | 
				
			||||||
    'configure'      => st('Configure site'),
 | 
					    'locale-initial-batch' => st('Setup translations'),
 | 
				
			||||||
 | 
					    'configure'            => st('Configure site'),
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $profiles = install_find_profiles();
 | 
					  $profiles = install_find_profiles();
 | 
				
			||||||
| 
						 | 
					@ -826,11 +886,13 @@ function install_task_list($active = NULL) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // If necessary, add translation import to the task list.
 | 
					  if (count($locales) < 2 || empty($_GET['locale']) || $_GET['locale'] == 'en') {
 | 
				
			||||||
  if (count($locales) > 1 && !empty($_GET['locale']) && $_GET['locale'] != 'en') {
 | 
					    // If not required, remove translation import from the task list.
 | 
				
			||||||
    $tasks += array(
 | 
					    unset($tasks['locale-initial-batch']);
 | 
				
			||||||
      'locale-batch' => st('Import translations'),
 | 
					  }
 | 
				
			||||||
    );
 | 
					  else {
 | 
				
			||||||
 | 
					    // If required, add remaining translations import task.
 | 
				
			||||||
 | 
					    $tasks += array('locale-remaining-batch' => st('Finish translations'));
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Add finished step as the last task.
 | 
					  // Add finished step as the last task.
 | 
				
			||||||
| 
						 | 
					@ -846,9 +908,10 @@ function install_task_list($active = NULL) {
 | 
				
			||||||
  drupal_set_content('left', theme_task_list($tasks, $active));
 | 
					  drupal_set_content('left', theme_task_list($tasks, $active));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function install_configure_form() {
 | 
					/**
 | 
				
			||||||
  // This is necessary to add the task to the $_GET args so the install
 | 
					 * Form API array definition for site configuration.
 | 
				
			||||||
  // system will know that it is done and we've taken over.
 | 
					 */
 | 
				
			||||||
 | 
					function install_configure_form(&$form_state, $url) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  $form['intro'] = array(
 | 
					  $form['intro'] = array(
 | 
				
			||||||
    '#value' => st('To configure your website, please provide the following information.'),
 | 
					    '#value' => st('To configure your website, please provide the following information.'),
 | 
				
			||||||
| 
						 | 
					@ -862,14 +925,13 @@ function install_configure_form() {
 | 
				
			||||||
  $form['site_information']['site_name'] = array(
 | 
					  $form['site_information']['site_name'] = array(
 | 
				
			||||||
    '#type' => 'textfield',
 | 
					    '#type' => 'textfield',
 | 
				
			||||||
    '#title' => st('Site name'),
 | 
					    '#title' => st('Site name'),
 | 
				
			||||||
    '#default_value' => variable_get('site_name', 'Drupal'),
 | 
					 | 
				
			||||||
    '#required' => TRUE,
 | 
					    '#required' => TRUE,
 | 
				
			||||||
    '#weight' => -20,
 | 
					    '#weight' => -20,
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
  $form['site_information']['site_mail'] = array(
 | 
					  $form['site_information']['site_mail'] = array(
 | 
				
			||||||
    '#type' => 'textfield',
 | 
					    '#type' => 'textfield',
 | 
				
			||||||
    '#title' => st('Site e-mail address'),
 | 
					    '#title' => st('Site e-mail address'),
 | 
				
			||||||
    '#default_value' => variable_get('site_mail', ini_get('sendmail_from')),
 | 
					    '#default_value' => ini_get('sendmail_from'),
 | 
				
			||||||
    '#description' => st('A valid e-mail address to be used as the "From" address by the auto-mailer during registration, new password requests, notifications, etc.  To lessen the likelihood of e-mail being marked as spam, this e-mail address should use the same domain as the website.'),
 | 
					    '#description' => st('A valid e-mail address to be used as the "From" address by the auto-mailer during registration, new password requests, notifications, etc.  To lessen the likelihood of e-mail being marked as spam, this e-mail address should use the same domain as the website.'),
 | 
				
			||||||
    '#required' => TRUE,
 | 
					    '#required' => TRUE,
 | 
				
			||||||
    '#weight' => -15,
 | 
					    '#weight' => -15,
 | 
				
			||||||
| 
						 | 
					@ -915,7 +977,7 @@ function install_configure_form() {
 | 
				
			||||||
  $form['server_settings']['date_default_timezone'] = array(
 | 
					  $form['server_settings']['date_default_timezone'] = array(
 | 
				
			||||||
    '#type' => 'select',
 | 
					    '#type' => 'select',
 | 
				
			||||||
    '#title' => st('Default time zone'),
 | 
					    '#title' => st('Default time zone'),
 | 
				
			||||||
    '#default_value' => variable_get('date_default_timezone', 0),
 | 
					    '#default_value' => 0,
 | 
				
			||||||
    '#options' => _system_zonelist(),
 | 
					    '#options' => _system_zonelist(),
 | 
				
			||||||
    '#description' => st('By default, dates in this site will be displayed in the chosen time zone.'),
 | 
					    '#description' => st('By default, dates in this site will be displayed in the chosen time zone.'),
 | 
				
			||||||
    '#weight' => 5,
 | 
					    '#weight' => 5,
 | 
				
			||||||
| 
						 | 
					@ -924,7 +986,7 @@ function install_configure_form() {
 | 
				
			||||||
  $form['server_settings']['clean_url'] = array(
 | 
					  $form['server_settings']['clean_url'] = array(
 | 
				
			||||||
    '#type' => 'radios',
 | 
					    '#type' => 'radios',
 | 
				
			||||||
    '#title' => st('Clean URLs'),
 | 
					    '#title' => st('Clean URLs'),
 | 
				
			||||||
    '#default_value' => variable_get('clean_url', 0),
 | 
					    '#default_value' => 0,
 | 
				
			||||||
    '#options' => array(0 => st('Disabled'), 1 => st('Enabled')),
 | 
					    '#options' => array(0 => st('Disabled'), 1 => st('Enabled')),
 | 
				
			||||||
    '#description' => st('This option makes Drupal emit "clean" URLs (i.e. without <code>?q=</code> in the URL).'),
 | 
					    '#description' => st('This option makes Drupal emit "clean" URLs (i.e. without <code>?q=</code> in the URL).'),
 | 
				
			||||||
    '#disabled' => TRUE,
 | 
					    '#disabled' => TRUE,
 | 
				
			||||||
| 
						 | 
					@ -947,15 +1009,22 @@ function install_configure_form() {
 | 
				
			||||||
    '#value' => st('Save'),
 | 
					    '#value' => st('Save'),
 | 
				
			||||||
    '#weight' => 15,
 | 
					    '#weight' => 15,
 | 
				
			||||||
  );
 | 
					  );
 | 
				
			||||||
 | 
					  $form['#action'] = $url;
 | 
				
			||||||
  $form['#redirect'] = FALSE;
 | 
					  $form['#redirect'] = FALSE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Allow the profile to alter this form. $form_state isn't available
 | 
				
			||||||
 | 
					  // here, but to conform to the hook_form_alter() signature, we pass
 | 
				
			||||||
 | 
					  // an empty array.
 | 
				
			||||||
  $hook_form_alter = $_GET['profile'] .'_form_alter';
 | 
					  $hook_form_alter = $_GET['profile'] .'_form_alter';
 | 
				
			||||||
  if (function_exists($hook_form_alter)) {
 | 
					  if (function_exists($hook_form_alter)) {
 | 
				
			||||||
    $hook_form_alter($form, 'install_configure');
 | 
					    $hook_form_alter($form, array(), 'install_configure');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return $form;
 | 
					  return $form;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Form API validate for the site configuration form.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
function install_configure_form_validate($form, &$form_state) {
 | 
					function install_configure_form_validate($form, &$form_state) {
 | 
				
			||||||
  if ($error = user_validate_name($form_state['values']['account']['name'])) {
 | 
					  if ($error = user_validate_name($form_state['values']['account']['name'])) {
 | 
				
			||||||
    form_error($form['admin_account']['account']['name'], $error);
 | 
					    form_error($form['admin_account']['account']['name'], $error);
 | 
				
			||||||
| 
						 | 
					@ -968,6 +1037,9 @@ function install_configure_form_validate($form, &$form_state) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Form API submit for the site configuration form.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
function install_configure_form_submit($form, &$form_state) {
 | 
					function install_configure_form_submit($form, &$form_state) {
 | 
				
			||||||
  global $user;
 | 
					  global $user;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1001,8 +1073,7 @@ function install_configure_form_submit($form, &$form_state) {
 | 
				
			||||||
  // The user is now logged in, but has no session ID yet, which
 | 
					  // The user is now logged in, but has no session ID yet, which
 | 
				
			||||||
  // would be required later in the request, so remember it.
 | 
					  // would be required later in the request, so remember it.
 | 
				
			||||||
  $user->sid = session_id();
 | 
					  $user->sid = session_id();
 | 
				
			||||||
 | 
					 | 
				
			||||||
  $form_state['redirect'] = 'finished';
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Start the installer.
 | 
				
			||||||
install_main();
 | 
					install_main();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -5,7 +5,7 @@
 | 
				
			||||||
 * Return an array of the modules to be enabled when this profile is installed.
 | 
					 * Return an array of the modules to be enabled when this profile is installed.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @return
 | 
					 * @return
 | 
				
			||||||
 *  An array of modules to be enabled.
 | 
					 *   An array of modules to enable.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function default_profile_modules() {
 | 
					function default_profile_modules() {
 | 
				
			||||||
  return array('color', 'comment', 'help', 'menu', 'taxonomy', 'dblog');
 | 
					  return array('color', 'comment', 'help', 'menu', 'taxonomy', 'dblog');
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,9 @@ function default_profile_modules() {
 | 
				
			||||||
 * Return a description of the profile for the initial installation screen.
 | 
					 * Return a description of the profile for the initial installation screen.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @return
 | 
					 * @return
 | 
				
			||||||
 *   An array with keys 'name' and 'description' describing this profile.
 | 
					 *   An array with keys 'name' and 'description' describing this profile,
 | 
				
			||||||
 | 
					 *   and optional 'language' to override the language selection for
 | 
				
			||||||
 | 
					 *   language-specific profiles.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function default_profile_details() {
 | 
					function default_profile_details() {
 | 
				
			||||||
  return array(
 | 
					  return array(
 | 
				
			||||||
| 
						 | 
					@ -39,38 +41,54 @@ function default_profile_task_list() {
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * Perform any final installation tasks for this profile.
 | 
					 * Perform any final installation tasks for this profile.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * The installer goes through the configure -> locale-import ->
 | 
					 * The installer goes through the profile-select -> locale-select
 | 
				
			||||||
 * locale-batch -> finished -> done tasks in this order, if you
 | 
					 * -> requirements -> database -> locale-initial-batch -> configure
 | 
				
			||||||
 * don't implement this function in your profile.
 | 
					 * -> locale-remaining-batch -> finished -> done tasks in this order,
 | 
				
			||||||
 | 
					 * if you don't implement this function in your profile.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * If this function is implemented, you can have any number of
 | 
					 * If this function is implemented, you can have any number of
 | 
				
			||||||
 * custom tasks to perform, implementing a state machine here to
 | 
					 * custom tasks to perform after 'configure', implementing a state
 | 
				
			||||||
 * walk the user through those tasks, by setting $task to something
 | 
					 * machine here to walk the user through those tasks. First time,
 | 
				
			||||||
 * other then the reserved tasks listed in install_reserved_tasks()
 | 
					 * this function gets called with $task set to 'profile', and you
 | 
				
			||||||
 * and the 'profile' task this function gets called with for first
 | 
					 * can advance to further tasks by setting $task to your tasks'
 | 
				
			||||||
 * time. If you implement your custom tasks, this function will get called
 | 
					 * identifiers, used as array keys in the hook_profile_task_list()
 | 
				
			||||||
 * in every HTTP request (for form processing, printing your
 | 
					 * above. You must avoid the reserved tasks listed in
 | 
				
			||||||
 * information screens and so on) until you advance to the
 | 
					 * install_reserved_tasks(). If you implement your custom tasks,
 | 
				
			||||||
 * 'locale-import' task, with which you hand control back to the
 | 
					 * this function will get called in every HTTP request (for form
 | 
				
			||||||
 * installer.
 | 
					 * processing, printing your information screens and so on) until
 | 
				
			||||||
 | 
					 * you advance to the 'profile-finished' task, with which you
 | 
				
			||||||
 | 
					 * hand control back to the installer. Each custom page you
 | 
				
			||||||
 | 
					 * return needs to provide a way to continue, such as a form
 | 
				
			||||||
 | 
					 * submission or a link. You should also set custom page titles.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * You should define the list of custom tasks you implement by
 | 
					 * You should define the list of custom tasks you implement by
 | 
				
			||||||
 * returning an array of them in hook_profile_task_list().
 | 
					 * returning an array of them in hook_profile_task_list(), as these
 | 
				
			||||||
 | 
					 * show up in the list of tasks on the installer user interface.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Should a profile want to display a form here, it can; it should set
 | 
					 * Remember that the user will be able to reload the pages multiple
 | 
				
			||||||
 * the task using variable_set('install_task', 'new_task') and use
 | 
					 * times, so you might want to use variable_set() and variable_get()
 | 
				
			||||||
 * the form technique used in install_tasks() rather than using
 | 
					 * to remember your data and control further processing, if $task
 | 
				
			||||||
 * drupal_get_form().
 | 
					 * is insufficient. Should a profile want to display a form here,
 | 
				
			||||||
 | 
					 * it can; the form should set '#redirect' to FALSE, and rely on
 | 
				
			||||||
 | 
					 * an action in the submit handler, such as variable_set(), to
 | 
				
			||||||
 | 
					 * detect submission and proceed to further tasks. See the configuration
 | 
				
			||||||
 | 
					 * form handling code in install_tasks() for an example.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Important: Any temporary variables should be removed using
 | 
				
			||||||
 | 
					 * variable_del() before advancing to the 'profile-finished' phase.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @param $task
 | 
					 * @param $task
 | 
				
			||||||
 *   The current $task of the install system. When hook_profile_tasks()
 | 
					 *   The current $task of the install system. When hook_profile_tasks()
 | 
				
			||||||
 *   is first called, this is 'profile'.
 | 
					 *   is first called, this is 'profile'.
 | 
				
			||||||
 | 
					 * @param $url
 | 
				
			||||||
 | 
					 *   Complete URL to be used for a link or form action on a custom page,
 | 
				
			||||||
 | 
					 *   if providing any, to allow the user to proceed with the installation.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * @return
 | 
					 * @return
 | 
				
			||||||
 *   An optional HTML string to display to the user. Only used if you
 | 
					 *   An optional HTML string to display to the user. Only used if you
 | 
				
			||||||
 *   modify the $task, otherwise discarded.
 | 
					 *   modify the $task, otherwise discarded.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
function default_profile_tasks(&$task) {
 | 
					function default_profile_tasks(&$task, $url) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Insert default user-defined node types into the database. For a complete
 | 
					  // Insert default user-defined node types into the database. For a complete
 | 
				
			||||||
  // list of available node type attributes, refer to the node type API
 | 
					  // list of available node type attributes, refer to the node type API
 | 
				
			||||||
| 
						 | 
					@ -117,3 +135,16 @@ function default_profile_tasks(&$task) {
 | 
				
			||||||
  // Update the menu router information.
 | 
					  // Update the menu router information.
 | 
				
			||||||
  menu_rebuild();
 | 
					  menu_rebuild();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Implementation of hook_form_alter().
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Allows the profile to alter the site-configuration form. This is
 | 
				
			||||||
 | 
					 * called through custom invocation, so $form_state is not populated.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					function default_form_alter(&$form, $form_state, $form_id) {
 | 
				
			||||||
 | 
					  if ($form_id == 'install_configure') {
 | 
				
			||||||
 | 
					    // Set default for site name field.
 | 
				
			||||||
 | 
					    $form['site_information']['site_name']['#default_value'] = 'Drupal';
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue