| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560 | <?php/** * @file * Bundle copy. *//** * Api function to get the bundle copy info. */function bundle_copy_get_info() {  static $info = FALSE;  if (!$info) {    return module_invoke_all('bundle_copy_info');  }  return $info;}/** * Implements hook_bundle_copy_info(). */function bundle_copy_bundle_copy_info() {  $info = array();  $info['node'] = array(    'bundle_export_callback' => 'node_type_get_type',    'bundle_save_callback' => 'node_type_save',    'export_menu' => array(      'path' => 'admin/structure/types/export',      'access arguments' => 'administer content types',    ),    'import_menu' => array(      'path' => 'admin/structure/types/import',      'access arguments' => 'administer content types',    ),  );  $info['user'] = array(    'bundle_export_callback' => '_bc_bundle_export_ignore',    'bundle_save_callback' => '_bc_bundle_save_ignore',    'export_menu' => array(      'path' => 'admin/config/people/accounts/export',      'access arguments' => 'administer users',    ),    'import_menu' => array(      'path' => 'admin/config/people/accounts/import',      'access arguments' => 'administer users',    ),  );  if (module_exists('taxonomy')) {    $info['taxonomy_term'] = array(      'bundle_export_callback' => '_bc_copy_taxonomy_load',      'bundle_save_callback' => '_bc_copy_taxonomy_save',      'export_menu' => array(        'path' => 'admin/structure/taxonomy/export',        'access arguments' => 'administer taxonomy',      ),      'import_menu' => array(        'path' => 'admin/structure/taxonomy/import',        'access arguments' => 'administer taxonomy',      ),    );  }  return $info;}/** * Implements hook_menu(). */function bundle_copy_menu() {  $items = array();  $bc_info = bundle_copy_get_info();  foreach ($bc_info as $entity_type => $info) {    $items[$info['export_menu']['path']] = array(      'title' => 'Export',      'page callback' => 'drupal_get_form',      'page arguments' => array('bundle_copy_export', $entity_type),      'access arguments' => array($info['export_menu']['access arguments']),      'type' => MENU_LOCAL_TASK    );    $items[$info['import_menu']['path']] = array(      'title' => 'Import',      'page callback' => 'drupal_get_form',      'page arguments' => array('bundle_copy_import', $entity_type),      'access callback' => 'bundle_copy_import_access',      'access arguments' => array($info['import_menu']['access arguments']),      'type' => MENU_LOCAL_TASK    );  }  return $items;}/** * Bundle copy import access callback. * * Bundle copy imports require an additional access check because they are PHP * code and PHP is more locked down than the general permission. */function bundle_copy_import_access($permission) {  return user_access($permission) && user_access('use PHP for settings');}/** * Menu callback: present the export page. */function bundle_copy_export($form, &$form_state, $entity_type = 'node') {  if (isset($form_state['step'])) {    $step = $form_state['step'];  }  else {    $step = 1;    $form_state['step'] = $step;  }  switch ($step) {    // Select the bundles.    case 1:      $bundles = _bundle_copy_bundle_info($entity_type, TRUE);      $form['bundle-info'] = array(        '#markup' => t('Select bundles you want to export.'),      );      $form['bundles'] = array(        '#type' => 'tableselect',        '#header' => array('label' => t('Bundle')),        '#options' => $bundles,        '#required' => TRUE,        '#empty' => t('No bundles found.'),      );      $form['next'] = array(        '#type' => 'submit',        '#value' => t('Next'),      );      break;    // List the fields / field groups.    case 2:      // Field group.      $all_groups = function_exists('field_group_info_groups') ? field_group_info_groups() : array();      // Fields.      $field_options = $instances = array();      $selected_bundles = $form_state['page_values'][1]['bundles'];      foreach ($selected_bundles as $key => $bundle) {        if ($key === $bundle) {          $instances += field_info_instances($entity_type, $bundle);        }      }      ksort($instances);      foreach ($instances as $key => $info) {        $field_options[$key]['field'] = $info['field_name']; // Same as $key.        $field_options[$key]['label'] = $info['label'];      }      $form['fields-info'] = array(        '#markup' => t('Select fields you want to export.'),      );      $form['fields'] = array(        '#type' => 'tableselect',        '#header' => array('field' => t('Field name'), 'label' => t('Label')),        '#options' => $field_options,        '#empty' => t('No fields found.'),      );      // Field group support.      if (!empty($all_groups)) {        $group_options = $fieldgroups = array();        if (isset($all_groups[$entity_type])) {          foreach ($selected_bundles as $key => $bundle) {            if ($key === $bundle) {              if (!isset($all_groups[$entity_type][$key])) {                continue;              }              foreach ($all_groups[$entity_type][$key] as $view_mode => $groups) {                foreach ($groups as $field_group) {                  $group_options[$field_group->id]['fieldgroup'] = $field_group->label . ' (' . $field_group->bundle . ' - ' . $field_group->mode .')';                  $fieldgroups[$field_group->id] = $field_group;                }              }            }          }        }        if (!empty($group_options)) {          $form['fieldgroups-info'] = array(            '#markup' => t('Select field groups you want to export.'),          );          $form['fieldgroups'] = array(            '#type' => 'tableselect',            '#header' => array('fieldgroup' => t('Field group name')),            '#options' => $group_options,          );          $form['fieldgroups-full'] = array(            '#type' => 'value',            '#value' => $fieldgroups,          );        }      }      $form['actions'] = array('#type' => 'actions');      $form['actions']['next'] = array(        '#type' => 'submit',        '#value' => t('Export'),      );      $bc_info = bundle_copy_get_info();      $form['actions']['cancel'] = array(        '#markup' => l(t('Cancel'), $bc_info[$entity_type]['export_menu']['path']),      );      break;    // Export data.    case 3:      $data = _bundle_copy_export_data($entity_type, $form_state['page_values']);      $form['export'] = array(        '#title' => t('Export data'),        '#type' => 'textarea',        '#cols' => 60,        '#value' => $data,        '#rows' => 40,        '#description' => t('Copy the export text and paste it into another bundle using the import function.'),      );      break;  }  return $form;}/** * Submit callback: export data. */function bundle_copy_export_submit($form, &$form_state) {  // Save the form state values.  $step = $form_state['step'];  $form_state['page_values'][$step] = $form_state['values'];  // Add step and rebuild.  $form_state['step'] = $form_state['step'] + 1;  $form_state['rebuild'] = TRUE;}/** * Menu callback: present the import page. */function bundle_copy_import($form, $form_state, $entity_type = 'node') {  $form['entity_type'] = array('#type' => 'value', '#value' => $entity_type);  $form['info'] = array(    '#markup' => t('This form will import bundle and field definitions.'),  );  //$form['type_name'] = array(  //  '#title' => t('Bundle'),  //  '#description' => t('Select the bundle to import these fields into.<br/>Select <Create> to create a new bundle to contain the fields.'),  //  '#type' => 'select',  //  '#options' => array('<create>' => t('<Create>')) + _bundle_copy_bundle_info($entity_type),  //);  $form['macro'] = array(    '#type' => 'textarea',    '#rows' => 10,    '#title' => t('Import data'),    '#required' => TRUE,    '#description' => t('Paste the text created by a bundle export into this field.'),  );  $form['submit'] = array(    '#type' => 'submit',    '#value' => t('Import'),  );  return $form;}/** * Submit callback: import data. */function bundle_copy_import_submit($form, &$form_state) {  // Evaluate data.  eval($form_state['values']['macro']);  if (isset($data) && is_array($data)) {    $modules = module_list();    $bc_info = bundle_copy_get_info();    // Create bundles.    foreach ($data['bundles'] as $key => $bundle) {      $entity_type = '';      if (is_object($bundle)) {        $entity_type = $bundle->bc_entity_type;      }      elseif (is_array($bundle)) {        $entity_type = $bundle['bc_entity_type'];      }      if (!empty($entity_type)) {        $existing_bundles = _bundle_copy_bundle_info($entity_type);        $bundle_save_callback = $bc_info[$entity_type]['bundle_save_callback'];        $bundle_info = $bundle_save_callback($bundle);        if (!isset($existing_bundles[$key])) {          drupal_set_message(t('%bundle bundle has been created.', array('%bundle' => $bundle->name)));        }        else {          drupal_set_message(t('%bundle bundle has been updated.', array('%bundle' => $bundle->name)));        }      }    }    // Create or update fields and their instances    if (isset($data['fields'])) {      foreach ($data['fields'] as $key => $field) {        // Check if the field module exists.        $module = $field['module'];        if (!isset($modules[$module])) {          drupal_set_message(t('%field_name field could not be created because the module %module is disabled or missing.', array('%field_name' => $key, '%module' => $module)), 'error');          continue;        }        if (isset($data['instances'][$key])) {          // Create or update field.          $prior_field = field_read_field($field['field_name'], array('include_inactive' => TRUE));          if (!$prior_field) {            field_create_field($field);            drupal_set_message(t('%field_name field has been created.', array('%field_name' => $key)));          }          else {            $field['id'] = $prior_field['id'];            field_update_field($field);            drupal_set_message(t('%field_name field has been updated.', array('%field_name' => $key)));          }          // Create or update field instances.          foreach ($data['instances'][$key] as $ikey => $instance) {            // Make sure the needed key exists.            if (!isset($instance['field_name'])) {              continue;            }            $prior_instance = field_read_instance($instance['entity_type'], $instance['field_name'], $instance['bundle']);            if (!$prior_instance) {              field_create_instance($instance);              drupal_set_message(t('%field_name instance has been created for @bundle in @entity_type.', array('%field_name' => $key, '@bundle' => $instance['bundle'], '@entity_type' => $instance['entity_type'])));            }            else {              $instance['id'] = $prior_instance['id'];              $instance['field_id'] = $prior_instance['field_id'];              field_update_instance($instance);              drupal_set_message(t('%field_name instance has been updated for @bundle in @entity_type.', array('%field_name' => $key, '@bundle' => $instance['bundle'], '@entity_type' => $instance['entity_type'])));            }          }        }      }    }    // Create / update fieldgroups.    if (isset($data['fieldgroups'])) {      if (module_exists('field_group')) {        ctools_include('export');        $existing_field_groups = field_group_info_groups();        foreach ($data['fieldgroups'] as $identifier => $fieldgroup) {          if (isset($existing_field_groups[$fieldgroup->entity_type][$fieldgroup->bundle][$fieldgroup->mode][$fieldgroup->group_name])) {            $existing = $existing_field_groups[$fieldgroup->entity_type][$fieldgroup->bundle][$fieldgroup->mode][$fieldgroup->group_name];            $fieldgroup->id = $existing->id;            if (!isset($fieldgroup->disabled)) {              $fieldgroup->disabled = FALSE;            }            ctools_export_crud_save('field_group', $fieldgroup);            ctools_export_crud_set_status('field_group', $fieldgroup, $fieldgroup->disabled);            drupal_set_message(t('%fieldgroup fieldgroup has been updated for @bundle in @entity_type.', array('%fieldgroup' => $fieldgroup->label, '@bundle' => $fieldgroup->bundle, '@entity_type' => $fieldgroup->entity_type)));          }          else {            unset($fieldgroup->id);            unset($fieldgroup->export_type);            if (!isset($fieldgroup->disabled)) {              $fieldgroup->disabled = FALSE;            }            ctools_export_crud_save('field_group', $fieldgroup);            $fieldgroup->export_type = 1;            ctools_export_crud_set_status('field_group', $fieldgroup, $fieldgroup->disabled);            drupal_set_message(t('%fieldgroup fieldgroup has been saved for @bundle in @entity_type.', array('%fieldgroup' => $fieldgroup->label, '@bundle' => $fieldgroup->bundle, '@entity_type' => $fieldgroup->entity_type)));          }        }      }      else {        drupal_set_message(t('The fieldgroups could not be saved because the <em>Field group</em> module is disabled or missing.'), 'error');      }    }    // Clear caches.    field_info_cache_clear();    if (module_exists('field_group')) {      cache_clear_all('field_groups', 'cache_field');    }  }  else {    drupal_set_message(t('The pasted text did not contain any valid export data.'), 'error');  }}/** * Return bundles for a certain entity type. * * @param $entity_type *   The name of the entity type. * @param $table_select *   Whether we're returning for the table select or not. */function _bundle_copy_bundle_info($entity_type, $table_select = FALSE) {  static $bundles = array();  if (!isset($bundles[$entity_type])) {    $bundles[$entity_type] = array();    $entity_info = entity_get_info($entity_type);    $entity_bundles = $entity_info['bundles'];    ksort($entity_bundles);    foreach ($entity_bundles as $key => $info) {      $label = isset($info['label']) ? $info['label'] : drupal_ucfirst(str_replace('_', ' ', $key));      if ($table_select) {        $bundles[$entity_type][$key]['label'] = $label;      }      else {        $bundles[$entity_type][$key] = $label;      }    }  }  return $bundles[$entity_type];}/** * Creates export data * * @param $entity_type *   The name of the entity_type * @param $selected_data *   The selected data. */function _bundle_copy_export_data($entity_type, $selected_data) {  ctools_include('export');  $bc_info = bundle_copy_get_info();  $selected_bundles = $selected_data[1]['bundles'];  $selected_fields = $selected_data[2]['fields'];  $selected_fieldgroups = isset($selected_data[2]['fieldgroups']) ? $selected_data[2]['fieldgroups'] : array();  $full_fieldgroups = isset($selected_data[2]['fieldgroups-full']) ? $selected_data[2]['fieldgroups-full'] : array();  $data = $instances = array();  $fields = field_info_fields();  foreach ($selected_bundles as $bkey => $binfo) {    if ($bkey !== $binfo) {      continue;    }    $field_instances = field_info_instances($entity_type, $bkey);    ksort($field_instances);    // Bundles export data.    $bundle_info_callback = $bc_info[$entity_type]['bundle_export_callback'];    $bundle_info = $bundle_info_callback($bkey, $entity_type);    if (is_object($bundle_info)) {      $bundle_info->bc_entity_type = $entity_type;    }    elseif (is_array($bundle_info)) {      $bundle_info['bc_entity_type'] = $entity_type;    }    $data['bundles'][$bkey] = $bundle_info;    // Fields export data.    foreach ($selected_fields as $fkey => $finfo) {      if ($fkey === $finfo) {        if (!isset($data['fields'][$fkey])) {          unset($fields[$fkey]['id']);          $data['fields'][$fkey] = $fields[$fkey];        }        if (isset($field_instances[$fkey])) {          unset($field_instances[$fkey]['id']);          unset($field_instances[$fkey]['field_id']);          $instances[$fkey][] = $field_instances[$fkey];        }      }    }  }  ksort($instances);  $data['instances'] = $instances;  // Field group export data.  if (!empty($selected_fieldgroups)) {    foreach ($selected_fieldgroups as $key => $value) {      if ($value !== 0) {        $data['fieldgroups'][$full_fieldgroups[$key]->identifier] = $full_fieldgroups[$key];      }    }  }  return '$data = ' . ctools_var_export($data) . ';';}/** * Helper function to load the taxonomy, but remove the vid on the object. * * @param $name *   The name of the bundle. */function _bc_copy_taxonomy_load($name) {  $bundle = taxonomy_vocabulary_machine_name_load($name);  return $bundle;}/** * Helper function to save the taxonomy. */function _bc_copy_taxonomy_save($bundle) {  if ($bundle->vid) {    unset($bundle->vid);  }  $vid = db_query('SELECT vid FROM {taxonomy_vocabulary} WHERE machine_name = :machine_name', array(':machine_name' => $bundle->machine_name))->fetchField();  if ($vid) {    $bundle->vid = $vid;  }  taxonomy_vocabulary_save($bundle);}/** * Helper function to ignore a bundle on export. */function _bc_bundle_export_ignore($name) {}/** * Helper function to ignore a bundle save. */function _bc_bundle_save_ignore($bundle) {}
 |