? 717874_mollom_ctools_export_2.patch ? mollom_ctools_export.patch Index: mollom.admin.inc =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/mollom/mollom.admin.inc,v retrieving revision 1.1.2.24 diff -u -p -r1.1.2.24 mollom.admin.inc --- mollom.admin.inc 16 Feb 2010 07:55:12 -0000 1.1.2.24 +++ mollom.admin.inc 22 Feb 2010 05:04:44 -0000 @@ -10,6 +10,8 @@ * Menu callback; Displays a list of forms configured for Mollom. */ function mollom_admin_form_list() { + $exportable = module_exists('ctools'); + $modes = array( MOLLOM_MODE_DISABLED => t('No protection'), MOLLOM_MODE_CAPTCHA => t('CAPTCHA only'), @@ -21,21 +23,53 @@ function mollom_admin_form_list() { t('Protection mode'), array('data' => t('Operations'), 'colspan' => 2), ); + if ($exportable) { + $header[] = t('Storage'); + } + $rows = array(); - $result = db_query("SELECT form_id FROM {mollom_form}"); - while ($form_id = db_result($result)) { - $mollom_form = mollom_form_load($form_id); - $rows[] = array( + foreach (mollom_form_load_all(NULL, TRUE) as $form_id => $mollom_form) { + $row = array( $mollom_form['title'], $modes[$mollom_form['mode']], l(t('Configure'), 'admin/settings/mollom/manage/' . $form_id), - l(t('Unprotect'), 'admin/settings/mollom/unprotect/' . $form_id), ); + if ($exportable) { + // Remove protection. + if ($mollom_form['export_type'] === EXPORT_IN_DATABASE) { + $row[] = l(t('Unprotect'), 'admin/settings/mollom/unprotect/' . $form_id); + } + else if (empty($mollom_form['disabled'])) { + $row[] = l(t('Disable'), 'admin/settings/mollom/disable/' . $form_id); + } + else { + $row[] = l(t('Enable'), 'admin/settings/mollom/enable/' . $form_id); + } + // Storage operations. + if (!empty($mollom_form['disabled'])) { + $row[] = t('Disabled'); + } + else { + if ($mollom_form['export_type'] & EXPORT_IN_DATABASE && $mollom_form['export_type'] & EXPORT_IN_CODE) { + $row[] = t('Overridden (!revert)', array('!revert' => l(t('revert'), 'admin/settings/mollom/revert/' . $form_id))); + } + else if ($mollom_form['export_type'] & EXPORT_IN_DATABASE) { + $row[] = t('Normal (!export)', array('!export' => l(t('export'), 'admin/settings/mollom/export/' . $form_id))); + } + else if ($mollom_form['export_type'] & EXPORT_IN_CODE) { + $row[] = t('Default'); + } + } + } + else { + $row[] = l(t('Unprotect'), 'admin/settings/mollom/unprotect/' . $form_id); + } + $rows[] = $row; } // Add a row to add a form. if (empty($rows)) { - $rows[] = array(array('data' => l(t('Add form'), 'admin/settings/mollom/add'), 'colspan' => 4)); + $rows[] = array(array('data' => l(t('Add form'), 'admin/settings/mollom/add'), 'colspan' => $exportable ? 5 : 4)); } return theme('table', $header, $rows); @@ -49,8 +83,7 @@ function mollom_admin_form_options() { $form_info = mollom_get_form_info(); // Remove already configured form ids. - $result = db_query("SELECT form_id FROM {mollom_form}"); - while ($form_id = db_result($result)) { + foreach (mollom_form_load_all(NULL, TRUE) as $form_id => $mollom_form) { unset($form_info[$form_id]); } // If all registered forms are configured already, output a message, and @@ -258,6 +291,74 @@ function mollom_admin_unprotect_form_sub } /** + * Form builder; Confirmation form for CTools operations. + */ +function mollom_admin_ctools_form(&$form_state, $action = 'revert', $mollom_form) { + $form['#tree'] = TRUE; + $form['form'] = array( + '#type' => 'item', + '#title' => t('Form'), + '#value' => $mollom_form['title'], + ); + $form['mollom']['form_id'] = array( + '#type' => 'value', + '#value' => $mollom_form['form_id'], + ); + $form['mollom']['action'] = array( + '#type' => 'value', + '#value' => $action, + ); + switch ($action) { + case 'revert': + $question = t('Are you sure you want to revert this form?'); + $description = t('The configuration for this form will be reverted to its default.'); + break; + case 'disable': + $question = t('Are you sure you want to disable this form?'); + $description = t('Mollom will no longer protect this form from spam while this configuration is disabled.'); + break; + case 'enable': + $question = t('Are you sure you want to enable this form?'); + $description = t('Mollom will begin protecting this form from spam.'); + break; + } + return confirm_form($form, $question, 'admin/settings/mollom', $description); +} + +/** + * Form submit handler for mollom_admin_revert_form(). + */ +function mollom_admin_ctools_form_submit($form, &$form_state) { + switch ($form_state['values']['mollom']['action']) { + case 'revert': + mollom_admin_unprotect_form_submit($form, $form_state); + break; + case 'enable': + ctools_include('export'); + ctools_export_set_status('mollom_form', $form_state['values']['mollom']['form_id'], FALSE); + break; + case 'disable': + ctools_include('export'); + ctools_export_set_status('mollom_form', $form_state['values']['mollom']['form_id'], TRUE); + break; + } + $form_state['redirect'] = 'admin/settings/mollom'; +} + +/** + * Form builder; Export a Mollom form configuration. + */ +function mollom_admin_export_form(&$form_state, $mollom_form) { + ctools_include('export'); + $objects = ctools_export_load_object('mollom_form', 'names', array($mollom_form)); + if (!empty($objects[$mollom_form])) { + $export = ctools_export_object('mollom_form', $objects[$mollom_form]); + $form = ctools_export_form($form_state, $export, t('Export Mollom form configuration')); + } + return $form; +} + +/** * Menu callback; renders the blacklist overview page. * * @todo Do we want to keep both blacklist on the same page? Index: mollom.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/mollom/mollom.install,v retrieving revision 1.2.2.23 diff -u -p -r1.2.2.23 mollom.install --- mollom.install 18 Feb 2010 22:20:15 -0000 1.2.2.23 +++ mollom.install 22 Feb 2010 05:04:45 -0000 @@ -126,6 +126,15 @@ function mollom_schema() { ), ), 'primary key' => array('form_id'), + 'export' => array( + 'key' => 'form_id', + 'api' => array( + 'owner' => 'mollom', + 'api' => 'mollom', + 'minimum_version' => 1, + 'current_version' => 1, + ), + ), ); $schema['cache_mollom'] = drupal_get_schema_unprocessed('system', 'cache'); Index: mollom.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/mollom/mollom.module,v retrieving revision 1.2.2.131 diff -u -p -r1.2.2.131 mollom.module --- mollom.module 20 Feb 2010 21:35:59 -0000 1.2.2.131 +++ mollom.module 22 Feb 2010 05:04:45 -0000 @@ -229,6 +229,42 @@ function mollom_menu() { 'file' => 'mollom.admin.inc', ); + // Add storage operation callbacks if CTools is present. + if (module_exists('ctools')) { + $items['admin/settings/mollom/revert/%mollom_form'] = array( + 'title' => 'Revert', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('mollom_admin_ctools_form', 'revert', 4), + 'access arguments' => array('administer mollom'), + 'type' => MENU_CALLBACK, + 'file' => 'mollom.admin.inc', + ); + $items['admin/settings/mollom/disable/%mollom_form'] = array( + 'title' => 'Disable', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('mollom_admin_ctools_form', 'disable', 4), + 'access arguments' => array('administer mollom'), + 'type' => MENU_CALLBACK, + 'file' => 'mollom.admin.inc', + ); + $items['admin/settings/mollom/enable/%mollom_form'] = array( + 'title' => 'Enable', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('mollom_admin_ctools_form', 'enable', 4), + 'access arguments' => array('administer mollom'), + 'type' => MENU_CALLBACK, + 'file' => 'mollom.admin.inc', + ); + $items['admin/settings/mollom/export'] = array( + 'title' => 'Export', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('mollom_admin_export_form', 4), + 'access arguments' => array('administer mollom'), + 'type' => MENU_CALLBACK, + 'file' => 'mollom.admin.inc', + ); + } + $items['admin/reports/mollom'] = array( 'title' => 'Mollom statistics', 'description' => 'Reports and usage statistics for the Mollom module.', @@ -408,6 +444,10 @@ function mollom_form_alter(&$form, &$for if (!user_access('bypass mollom protection') && _mollom_status() === TRUE) { // Retrieve configuration for this form. if ($mollom_form = mollom_form_load($form_id)) { + // If form is disabled bypass validation. + if (!empty($mollom_form['disabled'])) { + return; + } // Determine whether to bypass validation for the current user. foreach ($mollom_form['bypass access'] as $permission) { if (user_access($permission)) { @@ -528,13 +568,68 @@ function mollom_get_form_info($form_id = } /** + * Return an array of all configured Mollom forms. + * + * @param $form_id + * A specific form ID to retrieve. If omitted, all forms will be returned. + * @param $reset + * Boolean flag to reset the static cache. + */ +function mollom_form_load_all($form_id = NULL, $reset = FALSE) { + static $mollom_forms; + if (!isset($mollom_forms) || $reset) { + $mollom_forms = array(); + if (module_exists('ctools')) { + ctools_include('export'); + $mollom_forms = ctools_export_load_object('mollom_form'); + } + else { + $result = db_query("SELECT * FROM {mollom_form}"); + while ($mollom_form = db_fetch_object($result)) { + $mollom_form->enabled_fields = unserialize($mollom_form->enabled_fields); + $mollom_forms[$mollom_form->form_id] = $mollom_form; + } + } + foreach ($mollom_forms as $id => $mollom_form) { + // Cast each form as an array. + $mollom_form = (array) $mollom_form; + + // Attach form registry information. + $mollom_form += mollom_get_form_info($id); + + // Ensure default values (partially for administrative configuration). + $mollom_form += array( + 'form_id' => $id, + 'title' => $id, + 'elements' => array(), + ); + + $mollom_forms[$id] = $mollom_form; + } + } + if (isset($form_id)) { + return isset($mollom_forms[$form_id]) ? $mollom_forms[$form_id] : FALSE; + } + return $mollom_forms; +} + +/** * Menu argument loader; Loads Mollom configuration and form information for a given form id. */ function mollom_form_load($form_id) { - $mollom_form = db_fetch_array(db_query_range("SELECT * FROM {mollom_form} WHERE form_id = '%s'", $form_id, 0, 1)); - if ($mollom_form) { - $mollom_form['enabled_fields'] = unserialize($mollom_form['enabled_fields']); - + if (module_exists('ctools')) { + ctools_include('export'); + if ($objects = ctools_export_load_object('mollom_form', 'names', array($form_id))) { + $mollom_form = (array) $objects[$form_id]; + } + } + else { + $mollom_form = db_fetch_array(db_query_range("SELECT * FROM {mollom_form} WHERE form_id = '%s'", $form_id, 0, 1)); + if ($mollom_form) { + $mollom_form['enabled_fields'] = unserialize($mollom_form['enabled_fields']); + } + } + if (!empty($mollom_form)) { // Attach form registry information. $mollom_form += mollom_get_form_info($form_id);