Add installation function to content migrate that will swap the stored content_extra_...
authorKaren Stevenson
Wed, 5 Jan 2011 14:12:30 +0000 (14:12 +0000)
committerKaren Stevenson
Wed, 5 Jan 2011 14:12:30 +0000 (14:12 +0000)
modules/content_migrate/content_migrate.install [new file with mode: 0644]

diff --git a/modules/content_migrate/content_migrate.install b/modules/content_migrate/content_migrate.install
new file mode 100644 (file)
index 0000000..e64f497
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+
+/**
+ * Transfer weights from the D6 Manage Fields screen
+ * to the D7 stored settings array. Do this once only, on install,
+ * so later changes to these values in the Field UI screen will
+ * not be overwritten.
+ */
+function content_migrate_install() {
+  $stored_settings = variable_get('field_bundle_settings', array());
+
+  // $stored_settings might be empty, set up the basic structure of the
+  // array to avoid errors.
+  if (empty($stored_settings) || !array_key_exists('node', $stored_settings)) {
+    $stored_settings['node'] = array();
+  }
+  foreach (node_type_get_names() as $type_name => $label) {
+    // This type name may not yet exist in the array, set it up.
+    if (!array_key_exists($type_name, $stored_settings['node'])) {
+      $stored_settings['node'][$type_name] = array(
+        'extra_fields' => array('form' => array(), 'display' => array()),
+        'view_modes' => array(),
+      );
+    }
+    $weights = variable_get('content_extra_weights_'. $type_name, array());
+    
+    // If body has never been set in D6, it should be set to 0 to match the way D6 worked.
+    // The D7 core update may have set it to a value like -4.
+    if (empty($weights) || !array_key_exists('body_field', $weights)) {
+      $stored_settings['node'][$type_name]['extra_fields']['form']['body'] = array('weight' => 0);
+    }
+      
+    // If a field name provided by a custom module has changed from D6 to D7,
+    // they will have to alter this array too. We will set the original
+    // field name, other modules could take this information and move it 
+    // to a setting with the new field name.
+
+    // @TODO Have any of the other core field names changed?
+    // @TODO Should we do anything to alter the display settings?
+    foreach ($weights as $field => $weight) {
+      switch ($field) {
+        case 'body_field':
+          $new_field = 'body';
+          break;
+        default:
+          $new_field = $field;
+          break;
+      }
+      $stored_settings['node'][$type_name]['extra_fields']['form'][$new_field] = array('weight' => $weight);
+    }
+
+    // While we're here, update the body field with the right weight.
+    $body_weight = !empty($weights['body_field']) ? $weights['body_field'] : 0;
+    $instance = field_info_instance('node', 'body', $type_name);
+    if (!empty($instance)) {
+      $instance['widget']['weight'] = $body_weight;
+      foreach ($instance['display'] as $context => $format) {
+        $instance['display'][$context]['weight'] = $body_weight;
+      }
+      field_update_instance($instance);
+    }
+  }
+  variable_set('field_bundle_settings', $stored_settings);
+  field_info_cache_clear();
+}
\ No newline at end of file