? 350881_export_to_module-11.patch
? 350881_export_to_module-15.patch
Index: rules_admin/rules_admin.export.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/rules/rules_admin/Attic/rules_admin.export.inc,v
retrieving revision 1.1.2.5
diff -u -p -r1.1.2.5 rules_admin.export.inc
--- rules_admin/rules_admin.export.inc	20 Apr 2009 11:26:45 -0000	1.1.2.5
+++ rules_admin/rules_admin.export.inc	15 Jul 2009 08:58:22 -0000
@@ -72,7 +72,6 @@ function rules_item_rule_import(&$name, 
  * Item type callback: Customize to be imported rule sets
  */
 function rules_item_rule_set_import(&$name, &$rule_set) {
-
   if (!isset($rule_set['status']) || $rule_set['status'] == 'default') {
     $sets = rules_get_configured_items('rule_sets');
 
@@ -118,7 +117,7 @@ function rules_admin_import_workflow_ng(
 }
 
 /**
- * Exports one ore more configurations
+ * Exports one ore more configurations.
  */
 function rules_admin_form_export($form_state) {
   $form = array();
@@ -150,24 +149,79 @@ function rules_admin_form_export($form_s
         '#default_value' => 0,
       );
     }
+
+    $form['export_module'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Export to module'),
+      '#description' => t('Optional: You can export your rule and rule-set configuration to a new module, which provides them as default configuration.'),
+    );
+    $form['export_module']['module'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Module name'),
+      '#description' => t('Module name should be only a valid function name (a-z, 0-9, _).'),
+    );
     $form['button'] = array('#type' => 'submit', '#weight' => 10, '#value' => t('Export'));
   }
   else {
-    //show a textarea containg the exported configs
-    $form['result'] = array(
-      '#type' => 'textarea',
-      '#title' => t('Exported rule configurations'),
-      '#description' => t('Copy these data and paste them into the import page, to import.'),
-      '#rows' => 15,
-      '#attributes' => array('readonly' => 'readonly'),
-      '#default_value' => var_export($form_state['export'], TRUE),
-    );
+    if (empty($form_state['values']['module'])) {
+      // Show a textarea containg the exported configs.
+      $form['result'] = array(
+        '#type' => 'textarea',
+        '#title' => t('Exported rule configurations'),
+        '#description' => t('Copy these data and paste them into the import page, to import.'),
+        '#rows' => 30,
+        '#value' => $form_state['export'],
+        '#required' => FALSE,
+      );
+    }
+    else {
+      // Show export and default module information.
+      $module = check_plain($form_state['values']['module']);
+
+      $form['info_file'] = array(
+        '#title' => t('Copy and paste the following code into @module/@module.info in your modules directory', array('@module' => $module)),
+        '#type' => 'textarea',
+        '#id' => 'export-api-textarea',
+        '#name' => 'export-api-textarea',
+        '#attributes' => array(),
+        '#rows' => 9,
+        '#cols' => 60,
+        '#value' => rules_admin_export_default_module_info($module),
+        '#required' => FALSE,
+      );
+
+      // Add the exported data.
+      $form['result'] = array(
+        '#title' => t('Copy and paste the following code into @module.rules_default.inc in your @module/@module directory or @module/@module/includes directory', array('@module' => $module)),
+        '#type' => 'textarea',
+        '#id' => 'export-textarea',
+        '#name' => 'export-textarea',
+        '#attributes' => array(),
+        '#rows' => 30,
+        '#value' => $form_state['export'],
+        '#required' => FALSE,
+      );
+    }
   }
   return $form;
 }
 
+function rules_admin_form_export_validate($form, &$form_state) {
+  if (!empty($form_state['values']['module'])) {
+    // Invalid field name.
+    $module = $form_state['values']['module'];
+    // First character shouldn't be a number.
+    $first_char = substr($module, 0, 1);
+    if (!preg_match('!^[a-z0-9_]+$!', $module) || !preg_match('!^[a-z_]+$!', $first_char)) {
+      form_set_error('module', t('The module name %module is invalid. The name must include only lowercase unaccentuated letters, numbers, and underscores and should not start with a number.', array('%module' => $module)));
+    }
+  }
+}
+
 function rules_admin_form_export_submit($form, &$form_state) {
   $export = array();
+  // Module name to use as prefix for the rules configuration.
+  $module = !empty($form_state['values']['module']) ? $form_state['values']['module'] : '';
   foreach (array_filter($form_state['values']['export']) as $item_type => $item_names) {
     $items = rules_get_configured_items($item_type);
     $export[$item_type] = array_intersect_key($items, array_filter($item_names));
@@ -188,9 +242,15 @@ function rules_admin_form_export_submit(
     foreach (array_keys($export) as $item_type) {
       // Allow item specific adaption before exporting
       foreach ($export[$item_type] as $item_name => $item) {
-        rules_item_type_invoke($item_type, 'export', array($item_name, &$export[$item_type][$item_name], &$export));
+        rules_item_type_invoke($item_type, 'export', array($item_name, &$export[$item_type][$item_name], &$export, $module));
       }
     }
+    if ($module) {
+      rules_admin_form_export_module($export, $module);
+    }
+    else {
+      $export = var_export($export, TRUE);
+    }
     $form_state['export'] = $export;
   }
   else {
@@ -200,14 +260,85 @@ function rules_admin_form_export_submit(
 }
 
 /**
+ * Prepare the export to a default module.
+ */
+function rules_admin_form_export_module(&$export, $module = '') {
+  $code =  var_export($export, TRUE) .";\n";
+  // Make code Drupal standard.
+  $code = substr_replace(str_replace("\n", "\n  ", $code), '', -2, 2);
+  if (!$module) {
+    $export = $code;
+  }
+  else  {
+    // Export to module.
+    $code = '  return '. $code;
+    $api = "/**\n";
+    $api .= " * Implementation of hook_rules_defaults().\n";
+    $api .= " */\n";
+    $api .= "function @module_rules_defaults() {\n";
+    $api .= $code;
+    $api .= "}";
+
+    $api = strtr($api, array('@module' => check_plain(str_replace(' ', '_', $module))));
+    $export = $api;
+  }
+}
+
+/**
+ * Add info file information to the exported data.
+ */
+function rules_admin_export_default_module_info($module = '') {
+  $output = ';$Id:$'."\n";
+  $output .= "name = $module export module\n";
+  $output .= "description = Provides default rules configuration of $module.\n";
+  $output .= "dependencies[] = rules\n";
+  $output .= "core = 6.x\n";
+  return $output;
+}
+
+/**
+ * Prefix exported rules with the module name and change the status to default.
+ */
+function rules_item_rule_export($item_name, &$rule_export, &$export, $module = '') {
+  static $rules_name = array(); 
+  static $counter = 1;
+  if ($module) {
+    // Change #status to 'default'.
+    $export['rules'][$item_name]['#status'] = 'default';
+    if (strpos($item_name, $module) !== 0) {
+      // Find the a unique name for the rule.
+      while (in_array($module .'_'. $counter, $rules_name)) {
+        $counter++;
+      }
+      // Rename the rule name.
+      $export['rules'][$module .'_'. $counter] = $export['rules'][$item_name];
+      
+      $rules_name[] = $module .'_'. $counter;
+      
+      // Unset the non-prefixed item.
+      unset($export['rules'][$item_name]);
+    }
+    else {
+      $rules_name[] = $item_name;
+    }
+  }
+}
+
+/**
  * Item type callback: When exporting a rule set, add its rules to the export.
  */
-function rules_item_rule_set_export($set_name, &$rule_set, &$export) {
+function rules_item_rule_set_export($set_name, &$rule_set, &$export, $module = '') {
   $rules = rules_get_configured_items('rules');
   foreach ($rules as $name => $rule) {
     if ($rule['#set'] == $set_name) {
       $export['rules'][$name] = $rule;
+      // Allow rule specific adaption before exporting.
+      rules_item_type_invoke('rules', 'export', array($name, &$export['rules'][$name], &$export, $module));
+      
     }
   }
-}
-
+  if ($module) {
+    // Change the rule set status to default.
+    $export['rule_sets'][$set_name]['status'] = 'default';
+  }
+}
\ No newline at end of file
