You are here

function content_copy_import_form_submit in Content Construction Kit (CCK) 5

Same name and namespace in other branches
  1. 6.3 modules/content_copy/content_copy.module \content_copy_import_form_submit()
  2. 6 modules/content_copy/content_copy.module \content_copy_import_form_submit()
  3. 6.2 modules/content_copy/content_copy.module \content_copy_import_form_submit()

Submit handler for import form. For each submitted field: 1) add new field to the database 2) execute the imported field macro to update the settings to the imported values

File

./content_copy.module, line 293
Adds capability to import/export cck field data definitions.

Code

function content_copy_import_form_submit($form_id, $form_values) {

  // Get the content type we are importing into.
  $type_name = $form_values['type_name'];
  $type_label = node_get_types('name', $type_name);
  $content = NULL;

  // Convert the import formatted text back into a $content array.
  // Return if errors generated or not an array.
  eval($form_values['macro']);

  // Preliminary error trapping, must have valid arrays to work with.
  if (!is_array($content) || !is_array($content['type'])) {
    form_set_error('macro', t('The import data is not valid import text.'));
    return;
  }

  // Get all type and field info for this database.
  $content_info = _content_type_info();
  $imported_type = $content['type'];
  $imported_type_name = $imported_type['type'];
  $imported_type_label = $imported_type['name'];

  // It is allowed to import a type with no fields,
  // so the fields array could be empty and must be cast as an array.
  $imported_fields = (array) $content['fields'];

  // Perform more pre-import error trapping.
  // If there are potential problems, exit without doing the import.
  $not_enabled = array();

  // The groups array could be empty and still valid, make sure to cast it as an array.
  // If there are groups in the import, make sure the fieldgroup module is enabled.
  if (module_exists('fieldgroup')) {
    $imported_groups = (array) $content['groups'];
  }
  elseif (is_array($content['groups'])) {
    $not_enabled[] = 'fieldgroup';
  }

  // Make sure that all the field and widget modules in the import are enabled in this database.
  foreach ($imported_fields as $field) {
    if (empty($field['module'])) {
      $not_enabled[] = $field['field_name'];
    }
    else {
      $modules = explode(', ', $field['module']);
      foreach ($modules as $module) {
        if (!module_exists($module)) {
          $not_enabled[] = $module;
        }
      }
    }
  }

  // If any required module is not enabled, set an error message and exit.
  if ($not_enabled) {
    form_set_error('macro', t('The following modules must be enabled for this import to work: %modules.', array(
      '%modules' => implode(', ', array_unique($not_enabled)),
    )));
  }

  // Make sure the imported content type doesn't already exist in the database.
  if ($form_values['type_name'] == '<create>') {
    if (in_array($imported_type_name, array_keys($content_info['content types']))) {
      form_set_error('macro', t('The content type %type already exists in this database.', array(
        '%type' => $imported_type_name,
      )));
    }
  }
  if (form_get_errors()) {
    drupal_set_message(t('Exiting. No import performed.'), 'error');
    return;
  }

  // Create the content type, if requested.
  if ($form_values['type_name'] == '<create>') {
    $node = (object) $imported_type;
    $values = $imported_type;
    drupal_execute('node_type_form', $values, $node);

    // Reset type and database values once new type has been added.
    $type_name = $imported_type_name;
    $type_label = node_get_types('name', $type_name);
    $content_info = _content_type_info();
    if (form_get_errors() || !is_array($content_info['content types'][$type_name])) {
      drupal_set_message(t("An error has occured adding the content type %type.<br/>Please check the errors displayed for more details.", array(
        '%type' => $imported_type_name,
      )));
      return;
    }
  }

  // Create the groups for this type, if they don't already exist.
  if (module_exists('fieldgroup')) {
    $groups = fieldgroup_groups($type_name);
    $content_type = content_types($type_name);
    $errors = FALSE;
    foreach ($imported_groups as $group) {
      $group_name = $group['group_name'];
      if (!is_array($groups[$group_name])) {
        $values = (array) $group;
        drupal_execute('fieldgroup_edit_group_form', $values, $content_type, $group_name, 'add');
      }
    }
    cache_clear_all('fieldgroup_data', 'cache_content');

    // Reset the static variable in fieldgroup_groups() with new data.
    fieldgroup_groups('', FALSE, TRUE);
  }
  $should_clear_type_cache = 0;

  // Iterate through the field forms in the import and execute each.
  foreach ($imported_fields as $field) {

    // Make sure the field doesn't already exist in the type.
    // If so, do nothing, fields can't be duplicated within a content type.
    $field_name = $field['field_name'];
    $field_values = $field;
    $field_label = $field_values['label'];
    if (!empty($field['field_name']) && is_array($content_info['content types'][$type_name]['fields'][$field_name])) {
      drupal_set_message(t("The imported field %field_label (%field_name) was not added to %type because that field already exists in %type.", array(
        '%field_label' => $field_label,
        '%field_name' => $field_name,
        '%type' => $type_name,
      )));
    }
    else {
      $values = array();
      $errors = FALSE;

      // Check if field already exists in the database.
      // If not, add new, otherwise, add existing.
      if (!array_key_exists($field_name, $content_info['fields'])) {
        $values['field_name'] = $field_values['field_name'];
        $values['label'] = $field_values['label'];
        $values['field_widget_type'] = $field_values['field_type'] . '-' . $field_values['widget_type'];
        $values['type_name'] = $type_name;
        $field_url = drupal_execute('_content_admin_field_add_new', $values, $type_name, $field_name);
        if (form_get_errors()) {
          drupal_set_message(t("An error has occured adding the field %field_label (%field_name).<br/>Please check the errors displayed for more details.", array(
            '%field_label' => $field_label,
            '%field_name' => $field_name,
          )));
          $errors = TRUE;
        }
        else {

          // Retrieve the new field name by picking out the arg from the url returned by
          // _content_admin_field_add_new(), needed so the right field can be updated in the next step.
          $args = explode('/', $field_url);
          $field_name = array_pop($args);
          $field_values['field_name'] = $field_name;
        }
      }
      else {
        $values['field_name'] = $field_values['field_name'];
        $values['type_name'] = $type_name;
        drupal_execute('_content_admin_field_add_existing', $values, $type_name);
        if (form_get_errors()) {
          drupal_set_message(t("An error has occured adding the field %field_label (%field_name).<br/>Please check the errors displayed for more details.", array(
            '%field_label' => $field_label,
            '%field_name' => $field_name,
          )));
          $errors = TRUE;
        }
      }

      // Once the field has been added, update the settings with the macro values.
      // Replace the export type name with the import type name.
      if (!$errors) {
        $field_values['type_name'] = $type_name;
        drupal_execute('_content_admin_field', $field_values, $type_name, $field_name);
        if (form_get_errors()) {
          drupal_set_message(t("The field %field_label (%field_name) was added to the content type %type, but an error has occured updating the field settings.<br/>Please check the errors displayed for more details.", array(
            '%field_label' => $field_label,
            '%field_name' => $field_name,
            '%type' => $type_label,
          )));
        }
        else {

          // If we successfully updated the form, serialize the display_settings info
          // and insert the display_settings (if it exists) into the database.
          if (array_key_exists('display_settings', $field)) {
            $query = 'UPDATE {node_field_instance} SET display_settings = \'%s\' WHERE field_name = \'%s\'';
            db_query($query, serialize($field['display_settings']), $field['field_name']);
            if ($db_err = db_error()) {
              drupal_set_message(t("The field %field_label (%field_name) was added to the content type %type, but an error has occured updating the field's 'display_settings'.<br/>The db error is: '%db_err'.", array(
                '%field_label' => $field_label,
                '%field_name' => $field_name,
                '%type' => $type_label,
                '%db_err' => $db_err,
              )));
            }
            else {

              // If any data was successfully inserted into the DB,
              // we make sure the cache is cleared.
              $should_clear_type_cache = 1;
            }
          }
        }
      }
    }
  }

  // If no errors occured when inserting field data directly into the DB,
  // clear the type cache.
  if ($should_clear_type_cache) {
    content_clear_type_cache();
  }
  if (!form_get_errors()) {
    if (sizeof($imported_fields) > 0 || sizeof($imported_groups) > 0) {
      return 'admin/content/types/' . $content_info['content types'][$type_name]['url_str'] . '/fields';
    }
    else {
      return 'admin/content/types';
    }
  }
}