#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 functions
6.x
Gábor Hojtsy 2007-11-19 13:56:14 +00:00
parent c0994a3a4e
commit 04ca1b4676
3 changed files with 210 additions and 102 deletions

View File

@ -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"
*/ */

View File

@ -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();

View File

@ -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';
}
}