function features_export_build_form_submit in Features 7.2
Same name and namespace in other branches
- 6 features.admin.inc \features_export_build_form_submit()
- 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
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;
}
}
}