Index: includes/authorize.inc
===================================================================
RCS file: /Users/wright/drupal/local_repo/drupal/includes/authorize.inc,v
retrieving revision 1.3
diff -u -p -r1.3 authorize.inc
--- includes/authorize.inc 27 Oct 2009 03:27:00 -0000 1.3
+++ includes/authorize.inc 28 Oct 2009 00:03:28 -0000
@@ -72,17 +72,15 @@ function authorize_filetransfer_form($fo
'#attributes' => array('style' => 'display:none'),
);
- // Build a hidden fieldset for each one.
+ // Build a hidden div for each one.
foreach ($available_backends as $name => $backend) {
$form['connection_settings']['authorize_filetransfer_default']['#options'][$name] = $backend['title'];
$form['connection_settings'][$name] = array(
- '#type' => 'fieldset',
- '#attributes' => array('class' => "filetransfer-$name filetransfer"),
- '#title' => t('@backend connection settings', array('@backend' => $backend['title'])),
+ '#prefix' => '
',
+ '#suffix' => '
',
);
- $current_settings = variable_get('authorize_filetransfer_connection_settings_' . $name, array());
- $form['connection_settings'][$name] += system_get_filetransfer_settings_form($name, $current_settings);
+ $form['connection_settings'][$name] += _authorize_filetransfer_connection_settings($name, $backend);
// Start non-JS code.
if (isset($form_state['values']['connection_settings']['authorize_filetransfer_default']) && $form_state['values']['connection_settings']['authorize_filetransfer_default'] == $name) {
@@ -116,6 +114,65 @@ function authorize_filetransfer_form($fo
}
/**
+ * Generate the Form API array for the settings for a given connection backend.
+ *
+ * @param $backend
+ * The name of the backend (e.g. 'ftp', 'ssh', etc).
+ * @param array $info
+ * The array of information about the backend from the info hook.
+ * @return
+ * Form API array of connection settings for the given backend.
+ *
+ * @see hook_filetransfer_backends()
+ */
+function _authorize_filetransfer_connection_settings($backend, array $info) {
+ $defaults = variable_get('authorize_filetransfer_connection_settings_' . $backend, array());
+ $form = array();
+ // Invoke the callback to get the settings form.
+ if (!empty($info['settings_form']) && function_exists($info['settings_form'])) {
+ $form = $info['settings_form']();
+ }
+ // Fill in the defaults based on the saved settings, if any.
+ _authorize_filetransfer_connection_settings_set_defaults($form, NULL, $defaults);
+ return $form;
+}
+
+/**
+ * Recursively fill in the default settings on a file transfer connection form.
+ *
+ * The default settings for the file transfer connection forms are saved in
+ * the database. The settings are stored as a nested array in the case of a
+ * settings form that has fieldsets or otherwise uses a nested structure.
+ * Therefore, to properly add defaults, we need to walk through all the
+ * children form elements and process those defaults recursively.
+ *
+ * @param &$element
+ * Reference to the Form API form element we're operating on.
+ * @param $key
+ * The key for our current form element, if any.
+ * @param array $defaults
+ * The default settings for the file transfer backend we're operating on.
+ * @return
+ * Nothing, this function just sets $element['#default_value'] if needed.
+ */
+function _authorize_filetransfer_connection_settings_set_defaults(&$element, $key, array $defaults) {
+ // If we're operating on a form element which isn't a fieldset, and we have
+ // a default setting saved, stash it in #default_value.
+ if (!empty($key) && isset($defaults[$key]) && isset($element['#type']) && $element['#type'] != 'fieldset') {
+ $element['#default_value'] = $defaults[$key];
+ }
+ // Now, we walk through all the child elements, and recursively invoke
+ // ourself on each one. Since the $defaults settings array can be nested
+ // (because of #tree, any values inside fieldsets will be nested), if
+ // there's a subarray of settings for the form key we're currently
+ // processing, pass in that subarray to the recursive call. Otherwise, just
+ // pass on the whole $defaults array.
+ foreach (element_children($element) as $child_key) {
+ _authorize_filetransfer_connection_settings_set_defaults($element[$child_key], $child_key, ((isset($defaults[$key]) && is_array($defaults[$key])) ? $defaults[$key] : $defaults));
+ }
+}
+
+/**
* Validate callback for the filetransfer authorization form.
*
* @see authorize_filetransfer_form()
Index: modules/system/system.module
===================================================================
RCS file: /Users/wright/drupal/local_repo/drupal/modules/system/system.module,v
retrieving revision 1.827
diff -u -p -r1.827 system.module
--- modules/system/system.module 27 Oct 2009 04:16:39 -0000 1.827
+++ modules/system/system.module 27 Oct 2009 21:15:06 -0000
@@ -1543,27 +1543,6 @@ function system_filetransfer_backends()
}
/**
- * Helper function to return a form for configuring a filetransfer backend.
- *
- * @param string $filetransfer_backend_name
- * The name of the backend to return a form for.
- *
- * @param string $defaults
- * An associative array of settings to pre-populate the form with.
- */
-function system_get_filetransfer_settings_form($filetransfer_backend_name, $defaults) {
- $available_backends = module_invoke_all('filetransfer_backends');
- $form = call_user_func($available_backends[$filetransfer_backend_name]['settings_form']);
-
- foreach ($form as $name => &$element) {
- if (isset($defaults[$name])) {
- $element['#default_value'] = $defaults[$name];
- }
- }
- return $form;
-}
-
-/**
* Returns the form to configure the filetransfer class for FTP
*/
function system_filetransfer_backend_form_ftp() {