Commit 04ca1b46 authored by Gábor Hojtsy's avatar Gábor Hojtsy

#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
parent c0994a3a
......@@ -2416,22 +2416,31 @@ function _locale_get_predefined_list() {
* Language code to import translations for.
* @param $finished
* 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
* 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.
$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)) {
// Collect all files for all components, names as $langcode.po or
// with names ending with $langcode.po. This allows for filenames
// like node-module.de.po to let translators use small files and
// be able to import in smaller chunks.
$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
* @param $finished
* Optional finished callback for the batch.
* @param $components
* Optional list of component names the batch covers. Used in the installer.
* @return
* A batch structure
*/
function _locale_batch_build($files, $finished = NULL) {
function _locale_batch_build($files, $finished = NULL, $components = array()) {
$t = get_t();
if (count($files)) {
$operations = array();
......@@ -2490,6 +2501,9 @@ function _locale_batch_build($files, $finished = NULL) {
'init_message' => $t('Starting import'),
'error_message' => $t('Error importing interface translations'),
'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)) {
$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"
*/
This diff is collapsed.
......@@ -5,7 +5,7 @@
* Return an array of the modules to be enabled when this profile is installed.
*
* @return
* An array of modules to be enabled.
* An array of modules to enable.
*/
function default_profile_modules() {
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
* 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() {
return array(
......@@ -39,38 +41,54 @@ function default_profile_task_list() {
/**
* Perform any final installation tasks for this profile.
*
* The installer goes through the configure -> locale-import ->
* locale-batch -> finished -> done tasks in this order, if you
* don't implement this function in your profile.
* The installer goes through the profile-select -> locale-select
* -> requirements -> database -> locale-initial-batch -> configure
* -> 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
* custom tasks to perform, implementing a state machine here to
* walk the user through those tasks, by setting $task to something
* other then the reserved tasks listed in install_reserved_tasks()
* and the 'profile' task this function gets called with for first
* time. If you implement your custom tasks, this function will get called
* in every HTTP request (for form processing, printing your
* information screens and so on) until you advance to the
* 'locale-import' task, with which you hand control back to the
* installer.
* custom tasks to perform after 'configure', implementing a state
* machine here to walk the user through those tasks. First time,
* this function gets called with $task set to 'profile', and you
* can advance to further tasks by setting $task to your tasks'
* identifiers, used as array keys in the hook_profile_task_list()
* above. You must avoid the reserved tasks listed in
* install_reserved_tasks(). If you implement your custom tasks,
* this function will get called in every HTTP request (for form
* 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
* 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
* the task using variable_set('install_task', 'new_task') and use
* the form technique used in install_tasks() rather than using
* drupal_get_form().
* Remember that the user will be able to reload the pages multiple
* times, so you might want to use variable_set() and variable_get()
* to remember your data and control further processing, if $task
* 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
* The current $task of the install system. When hook_profile_tasks()
* 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
* An optional HTML string to display to the user. Only used if you
* 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
// 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.
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';
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment