Edit

Drupal Migrates multigroups in D6 to field collections in D7

Subject to

<?php

/////////////////// PAGE DEFINITIONS ///////////////////


function migrate_groups_menu(){
    $menu["migrate_groups"] = array(
        "title" => "Migrate grps",
        "description" => "....",
        "page callback" => "migrate_multigroup_to_collections",
        "access callback" => TRUE,
    );
    return $menu;
}



/*function migrate_multigroup_to_collections() {
  $content_type = 'thing';
  $collection_field = 'field_context';
  $multigroup_fields = array(
    'field_connection',
    'field_title_in_context',
  );

  // Get all the nodes that have value in the multigroup.
  $query = db_select('field_data_' . $multigroup_fields[0])
    ->condition('entity_type', 'node')
    ->condition('bundle', $content_type);
  $query->addExpression('DISTINCT entity_id', 'nid');
  $query->addExpression('revision_id', 'vid');
  $nodes_result = $query->execute();

  foreach ($nodes_result as $node) {
    // Construct the legacy multigroup for the node from the individual fields.
    $multigroup_data = array();
    foreach ($multigroup_fields as $field) {
      $field_result = db_select('field_data_' . $field, 'field')
        ->fields('field')
        ->condition('entity_type', 'node')
        ->condition('entity_id', $node->nid)
        ->execute();

      foreach ($field_result as $field_item) {
        $multigroup_data[$field_item->delta][$field] = $field_item;
      }

    }

    // Step through the reconstructed multigroups, which are collections from now.
    foreach ($multigroup_data as $delta => $data) {
      // Create entry in field_collection_item table.
      $id = db_insert('field_collection_item')
        ->fields(array('field_name' => $collection_field))
        ->execute();

      // Attach collection field data to the node.
      db_insert('field_data_' . $collection_field)
        ->fields(array(
          'entity_type' => 'node',
          'bundle' => $content_type,
          'entity_id' => $node->nid,
          'revision_id' => $node->vid,
          'language' => 'und',
          'delta' => $delta,
          $collection_field . '_value' => $id,
        ))
        ->execute();

      // Go through all the fields in the multigroup.
      foreach ($data as $multigroup_field => $field_data) {
        // Reassign the fields in the multigroup from the node to the collection field instance.
        db_update('field_data_' . $multigroup_field)
          ->fields(array(
            'entity_type' => 'field_collection_item',
            'bundle' => $collection_field,
            'entity_id' => $id,
            'revision_id' => $id,
            'delta' => 0,
          ))
          ->condition('entity_type', 'node')
          ->condition('entity_id', $node->nid)
          ->condition('delta', $delta)
          ->execute();

      }
    }
  }
  return "FINISHED";
}*/



function migrate_multigroup_to_collections($content_type='page',$collection_field='field_context',$multigroup_fields=array('field_connection','field_weight','field_notes')) {

  // Get all the nodes that have value in the multigroup.
  $query = db_select('field_data_' . $multigroup_fields[0])
    ->condition('entity_type', 'node')
    ->condition('bundle', $content_type);
  $query->addExpression('DISTINCT entity_id', 'nid');
  $query->addExpression('revision_id', 'vid');
  $nodes_result = $query->execute();

  foreach ($nodes_result as $node) {
    // Construct the legacy multigroup for the node from the individual fields.
    $multigroup_data = array();
    foreach ($multigroup_fields as $field) {
      $field_result = db_select('field_data_' . $field, 'field')
        ->fields('field')
        ->condition('entity_type', 'node')
        ->condition('entity_id', $node->nid)
        ->execute();

      foreach ($field_result as $field_item) {
        $multigroup_data[$field_item->delta][$field] = $field_item;
      }

    }

    $id = 0;
    // Step through the reconstructed multigroups, which are collections from now.
    foreach ($multigroup_data as $delta => $data) {
      // Create entry in field_collection_item table.
      $id = db_insert('field_collection_item')
        ->fields(array('field_name' => $collection_field, 'revision_id' => 0, 'archived' => 0))
        ->execute();

      $revid = db_insert('field_collection_item_revision')
        ->fields(array('item_id' => $id))
        ->execute();

      db_update('field_collection_item')
          ->fields(array('revision_id' => $revid))
          ->condition('item_id', $id)
          ->execute();


      // Attach collection field data to the node.
      db_insert('field_data_' . $collection_field)
        ->fields(array(
          'entity_type' => 'node',
          'bundle' => $content_type,
          'entity_id' => $node->nid,
          'revision_id' => $node->vid,
          'language' => 'und',
          'delta' => $delta,
          $collection_field . '_value' => $id,
          $collection_field . '_revision_id' => $revid,
        ))
        ->execute();

      // Attach collection field data to the node.
      db_insert('field_revision_' . $collection_field)
        ->fields(array(
          'entity_type' => 'node',
          'bundle' => $content_type,
          'entity_id' => $node->nid,
          'revision_id' => $node->vid,
          'language' => 'und',
          'delta' => $delta,
          $collection_field . '_value' => $id,
          $collection_field . '_revision_id' => $revid,
        ))
        ->execute();

      // Go through all the fields in the multigroup.
      foreach ($data as $multigroup_field => $field_data) {
        // Reassign the fields in the multigroup from the node to the collection field instance.
        db_update('field_data_' . $multigroup_field)
          ->fields(array(
            'entity_type' => 'field_collection_item',
            'bundle' => $collection_field,
            'entity_id' => $id,
            'language' => 'und',
            'revision_id' => $revid,
            'delta' => 0,
          ))
          ->condition('entity_type', 'node')
          ->condition('entity_id', $node->nid)
          ->condition('delta', $delta)
          ->execute();

       db_delete('field_revision_' . $multigroup_field)
          ->condition('entity_type', 'node')
          ->condition('entity_id', $node->nid)
        ->execute();
      $qry = "INSERT INTO field_revision_$multigroup_field SELECT * FROM field_data_$multigroup_field WHERE entity_id = $id AND entity_type = 'field_collection_item' AND bundle = '$collection_field'";
      db_query($qry);

      }
    }
  }
  return "DONE";
}

?>