You are here

function features_export_build_form_submit in Features 7.2

Same name and namespace in other branches
  1. 6 features.admin.inc \features_export_build_form_submit()
  2. 7 features.admin.inc \features_export_build_form_submit()

First submit handler 'Generate feature' and 'Download feature' buttons.

Parameters

array $form: Form.

array $form_state: Form state.

See also

features_export_form()

1 string reference to 'features_export_build_form_submit'
features_export_form in ./features.admin.inc
Form builder for features export form.

File

./features.admin.inc, line 972
Forms for Features admin screens.

Code

function features_export_build_form_submit($form, &$form_state) {
  $feature = $form['#feature'];
  $export = _features_export_build($feature, $form_state);
  $export = _features_export_generate($export, $form_state, $feature);
  $generate = isset($form_state['values']['generate']) && $form_state['values']['op'] == $form_state['values']['generate'];
  $module_name = $form_state['values']['module_name'];
  if ($generate && !user_access('generate features')) {
    drupal_set_message(t("No permission for generating features."));
    return;
  }

  // Generate download.
  if ($files = features_export_render($export, $module_name, TRUE)) {
    $filename = (!empty($export['version']) ? "{$module_name}-{$export['version']}" : $module_name) . '.tar';
    if ($generate) {
      $success = TRUE;
      $destination = variable_get('features_default_export_path', FEATURES_DEFAULT_EXPORT_PATH);
      $directory = !empty($export['project path']) ? $export['project path'] . '/' . $module_name : (isset($feature->filename) ? dirname($feature->filename) : $destination . '/' . $module_name);
      if (!is_dir($directory)) {
        if (mkdir($directory, 0777, TRUE) === FALSE) {
          $success = FALSE;
        }
      }
    }
    else {

      // Clear out output buffer to remove any garbage from tar output.
      if (ob_get_level()) {
        ob_end_clean();
      }
      drupal_add_http_header('Content-type', 'application/x-tar');
      drupal_add_http_header('Content-Disposition', 'attachment; filename="' . $filename . '"');
      drupal_send_headers();
    }
    $tar = array();
    $filenames = array();

    // Write additional files from $files['_files'], if present.
    if (!empty($files['_files'])) {
      foreach ($files['_files'] as $file_name => $file_info) {
        if ($generate) {

          // Create a subdirectory, if needed.
          // @todo Support nested subdirectories, see #3060408.
          if (strpos($file_name, '/')) {
            $file_directory = $directory . '/' . substr($file_name, 0, strrpos($file_name, '/'));
            if (!is_dir($file_directory)) {
              mkdir($file_directory);
            }
          }
          if (!empty($file_info['file_path'])) {
            file_unmanaged_copy($file_info['file_path'], "{$directory}/{$file_name}", FILE_EXISTS_REPLACE);
          }
          elseif ($file_info['file_content']) {
            file_put_contents("{$directory}/{$file_name}", $file_info['file_content']);
          }
        }
        else {
          if (!empty($file_info['file_path'])) {
            print features_tar_create("{$module_name}/{$file_name}", file_get_contents($file_info['file_path']));
          }
          elseif ($file_info['file_content']) {
            features_tar_create("{$directory}/{$file_name}", $file_info['file_content']);
          }
        }
      }
      unset($files['_files']);
    }
    foreach ($files as $extension => $file_contents) {
      if (!in_array($extension, array(
        'module',
        'info',
      ))) {
        $extension .= '.inc';
      }
      $filenames[] = "{$module_name}.{$extension}";
      if ($generate) {
        if (file_put_contents("{$directory}/{$module_name}.{$extension}", $file_contents) === FALSE) {
          $success = FALSE;
        }
      }
      else {
        print features_tar_create("{$module_name}/{$module_name}.{$extension}", $file_contents);
      }
    }
    if (features_get_modules($module_name, TRUE)) {

      // Prevent deprecated component files from being included in download.
      $deprecated = features_get_deprecated();
      foreach ($deprecated as $component) {
        $info = features_get_components($component);
        $filename = isset($info['default_file']) && $info['default_file'] == FEATURES_DEFAULTS_CUSTOM ? $info['default_filename'] : "features.{$component}";
        $filename .= '.inc';
        $filenames[] = "{$module_name}.{$filename}";
      }
      $module_path = drupal_get_path('module', $module_name);

      // file_scan_directory() can throw warnings when using PHP 5.3, messing
      // up the output of our file stream. Suppress errors in this one case in
      // order to produce valid output.
      foreach (@file_scan_directory($module_path, '/.*/') as $file) {
        $filename = substr($file->uri, strlen($module_path) + 1);
        if (!in_array($filename, $filenames)) {

          // Add this file.
          $contents = file_get_contents($file->uri);
          if ($generate) {
            if (file_put_contents("{$directory}/{$filename}", $contents) === FALSE) {
              $success = FALSE;
            }
          }
          else {
            print features_tar_create("{$module_name}/{$filename}", $contents);
          }
          unset($contents);
        }
      }
    }
    if ($generate) {
      if ($success) {
        drupal_set_message(t("Module @name written to @directory", array(
          '@name' => $export['name'],
          '@directory' => $directory,
        )));
      }
      else {
        drupal_set_message(t("Could not write module to @path. ", array(
          '@path' => $directory,
        )) . t("Ensure your file permissions allow the web server to write to that directory."), "error");
      }
    }
    else {
      print pack("a1024", "");
      exit;
    }
  }
}