Index: import_export_tool.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/import_export_tool/import_export_tool.module,v retrieving revision 1.1 diff -u -p -r1.1 import_export_tool.module --- import_export_tool.module 17 Mar 2009 20:26:03 -0000 1.1 +++ import_export_tool.module 1 Apr 2009 20:27:56 -0000 @@ -6,374 +6,267 @@ * Allows administrators to import/export content types and views. */ - function import_export_tool_menu() { $items = array(); - + $items['admin/settings/import_export_tool'] = array( - 'title' => 'Import/Export settings', - 'description' => 'Import/Export settings allows user to configure paths etc.', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('import_export_tool_settings'), - 'access callback' => 'user_access', - 'access arguments' => array('administer permissions'), - 'type' => MENU_NORMAL_ITEM); - $items['admin/build/export'] = array( - 'title' => 'Export CCK types and views', - 'description' => 'Export types and views into text files.', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('import_export_tool_types_views_export'), - 'access callback' => 'user_access', - 'access arguments' => array('administer permissions'), - 'type' => MENU_NORMAL_ITEM); - $items['admin/build/import'] = array( - 'title' => 'Import CCK types and views', - 'description' => 'Import types and views into text files.', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('import_export_tool_types_views_import'), - 'access callback' => 'user_access', - 'access arguments' => array('administer permissions'), - 'type' => MENU_NORMAL_ITEM); + 'title' => 'Import/Export tool', + 'description' => 'Specify the path where exported files will be saved.', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('import_export_tool_settings'), + 'access callback' => 'user_access', + 'access arguments' => array('administer permissions'), + ); + $items['admin/build/import_export_tool'] = array( + 'title' => 'Import and Export', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('import_export_tool_export_form'), + 'access callback' => 'user_access', + 'access arguments' => array('administer permissions'), + 'type' => MENU_NORMAL_ITEM, + ); + $items['admin/build/import_export_tool/export'] = array( + 'title' => 'Export content types and views', + 'description' => 'Content types and views will be exported into text files.', + 'access callback' => 'user_access', + 'access arguments' => array('administer permissions'), + 'type' => MENU_DEFAULT_LOCAL_TASK, + ); + $items['admin/build/import_export_tool/import'] = array( + 'title' => 'Import content types and views', + 'description' => 'Find content types and views that have been serialized to files and import them.', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('import_export_tool_import_form'), + 'access callback' => 'user_access', + 'access arguments' => array('administer permissions'), + 'type' => MENU_LOCAL_TASK, + 'weight' => 5, + ); return $items; } function import_export_tool_settings() { - $form['import_export_tool_path'] = array( - '#type' => 'textfield', - '#title' => t('Specify path for export_import'), - '#default_value' => variable_get('import_export_tool_path', file_directory_temp() .'/store'), - '#description' => t('Enter the path to store files with cck types and views.') + '#type' => 'textfield', + '#title' => t('Specify path for where content type and views files will be saved.'), + '#default_value' => variable_get('import_export_tool_path', import_export_tool_get_directory()), + '#description' => t('Enter the path where exported files will be saved. The webserver must have permissions to write to this directory. The path may be relative or absolute. Relative paths will be relative to your files directory (%files).', array('%files' => file_directory_path())), ); - + return system_settings_form($form); } +function import_export_tool_get_directory() { + return variable_get('import_export_tool_path', file_directory_path() . '/import_export_tool'); +} + function import_export_tool_theme() { return array( - 'import_export_tool_types_views_export' => array( - 'arguments' => array('form' => array())), - 'import_export_tool_types_views_import' => array( - 'arguments' => array('form' => array()))); + 'import_export_tool_export_form' => array( + 'arguments' => array('form' => array()), + ), + 'import_export_tool_import_form' => array( + 'arguments' => array('form' => array()), + ), + ); } -function import_export_tool_types_views_import() { - - $dir = variable_get('import_export_tool_path', file_directory_temp() .'/store'); - $files = array(); - if ($handle = opendir($dir)) { - while (false !== ($file = readdir($handle))) { - $files[] = $file; - } - closedir($handle); - } - - $views = array(); - $types = array(); - - foreach ($files as $file_name) { - if (strstr($file_name, '.view')) { - $view_temp = explode(".", $file_name); - $views[$view_temp[0]] = $view_temp[0]; - } - elseif (strstr($file_name, '.cck')) { - $cck_temp = explode(".", $file_name); - $types[$cck_temp[0]] = $cck_temp[0]; - } +function import_export_tool_import_form() { + $dir = import_export_tool_get_directory(); + $ignore = array('.', '..', 'CVS'); + $cck_files = file_scan_directory(realpath($dir), '.cck', $ignore); + $views_files = file_scan_directory(realpath($dir), '.views', $ignore); + + if (count($cck_files) > 0) { + foreach ($cck_files as $file) { + $content_type_options[$file->filename] = $file->name; + } + $form['content_types'] = array( + '#type' => 'checkboxes', + '#options' => $content_type_options, + '#title' => t('Content types'), + ); + } + + if (count($views_files) > 0) { + foreach ($views_files as $file) { + $views_options[$file->filename] = $file->name; + } + $form['views'] = array( + '#type' => 'checkboxes', + '#options' => $views_options, + '#title' => t('Views'), + ); } - - if (count ($types) > 0) { - foreach ($types as $type_k => $type_v) { - $form['types'][$type_k]['value'] = array('#type' => 'checkbox', '#name' => $type_k .'_cck_', '#value' => $type_k, '#width' => 10000); - $form['types'][$type_k]['title'] = array('#type' => 'item', '#value' => $type_v); - } - } - - $form['header_cck'] = array('#type' => 'value', '#value' => array( - theme('table_select_header_cell'), - array('data' => t('CCK type Name'), 'field' => 'title'))); - - if (count ($views) > 0) { - foreach ($views as $view_k => $view_v) { - $form['views'][$view_k]['value'] = array('#type' => 'checkbox', '#name' => $view_k .'_vw_', '#value' => $view_k); - $form['views'][$view_k]['title'] = array('#type' => 'item', '#value' => $view_v); - } - } - - $form['header_views'] = array('#type' => 'value', '#value' => array( - theme('table_select_header_cell'), - array('data' => t('View Name'), 'field' => 'title'), - )); - - if (count ($views) > 0 || count ($types)) { + + if (isset($form['views']) || isset($form['content_types'])) { $form['import'] = array( - '#type' => 'submit', - '#value' => 'Import', - '#validate' => array('import_export_tool_types_views_import_validate')); + '#type' => 'submit', + '#value' => t('Import'), + ); } - + return $form; } -function import_export_tool_types_views_export() { - foreach (module_implements ('views_exportables') as $module) { - $function = $module .'_views_exportables'; - $exportables[$module] = $function ('list'); +function import_export_tool_export_form() { + $exportables = array(); + foreach (module_implements('views_exportables') as $module) { + $function = $module . '_views_exportables'; + $exportables += $function('list'); } - - foreach ($exportables['views'] as $view) { + foreach ($exportables as $view) { $views[$view['name']] = $view['name']; } - - $types = content_copy_types(); - - foreach ($types as $type_k => $type_v) { - $form['types'][$type_k]['value'] = array('#type' => 'checkbox', '#name' => $type_k .'_cck_', '#value' => $type_k, '#width' => 10000); - $form['types'][$type_k]['title'] = array('#type' => 'item', '#value' => $type_v); - } - - $form['header_cck'] = array('#type' => 'value', '#value' => array( - theme('table_select_header_cell'), - array('data' => t('CCK type Name'), 'field' => 'title'))); - - foreach ($views as $view_k => $view_v) { - $form['views'][$view_k]['value'] = array('#type' => 'checkbox', '#name' => $view_k .'_vw_', '#value' => $view_k); - $form['views'][$view_k]['title'] = array('#type' => 'item', '#value' => $view_v); - } - - $form['header_views'] = array('#type' => 'value', '#value' => array( - theme('table_select_header_cell'), - array('data' => t('View Name'), 'field' => 'title'))); - - $form['export'] = array( - '#type' => 'submit', - '#value' => 'Export', - '#validate' => array('import_export_tool_types_views_export_validate'), - '#weight' => 5); - + if (count($views) > 0) { + $form['views'] = array( + '#type' => 'checkboxes', + '#title' => t('Views'), + '#options' => $views, + ); + } + + $content_types = content_copy_types(); + if (count($content_types) > 0) { + $form['content_types'] = array( + '#type' => 'checkboxes', + '#title' => t('Content types'), + '#options' => $content_types, + ); + } + + $form['submit'] = array( + '#type' => 'submit', + '#value' => t('Export'), + ); + return $form; } -function theme_import_export_tool_types_views_import($form) { - $rows_type = array(); - - foreach ($form['types'] as $key => $value) { - if ($key[0] == "#") continue; - $rows_type[] = array( - array('data' => drupal_render($form['types'][$key]['value'])), - array('data' => drupal_render($form['types'][$key]['title'])) - ); - } - - foreach ($form['views'] as $key => $value) { - if ($key[0] == "#") continue; - $rows_view[] = array( - array('data' => drupal_render($form['views'][$key]['value'])), - array('data' => drupal_render($form['views'][$key]['title'])) - ); - } - - $output .= theme('table', $form['header_cck']['#value'], $rows_type); - $output .= theme('table', $form['header_views']['#value'], $rows_view); - $output .= drupal_render($form); - return $output; -} +function theme_import_export_tool_import_form($form) { + $views_rows = $content_type_rows = array(); + $views_title = $form['views']['#title']; + unset($form['views']['#title']); + ksort($form['views']); + foreach (element_children($form['views']) as $position => $name) { + $title = $form['views'][$name]['#title']; + unset($form['views'][$name]['#title']); + $views_rows[] = array(drupal_render($form['views'][$name]), $title); + } + $output .= theme('table', array(theme('table_select_header_cell'), array('data' => $views_title, 'width' => '95%')), $views_rows); + + $content_types_title = $form['content_types']['#title']; + unset($form['content_types']['#title']); + ksort($form['content_types']); + foreach (element_children($form['content_types']) as $position => $name) { + $title = $form['content_types'][$name]['#title']; + unset($form['content_types'][$name]['#title']); + $content_type_rows[] = array(drupal_render($form['content_types'][$name]), $title); + } + $output .= theme('table', array(theme('table_select_header_cell'), array('data' => $content_types_title, 'width' => '95%')), $content_type_rows); -function theme_import_export_tool_types_views_export($form) { - $rows_type = array(); - - foreach ($form['types'] as $key => $value) { - if ($key[0] == "#") continue; - $rows_type[] = array( - array('data' => drupal_render($form['types'][$key]['value'])), - array('data' => drupal_render($form['types'][$key]['title'])) - ); - } - - foreach ($form['views'] as $key => $value) { - if ($key[0] == "#") continue; - $rows_view[] = array( - array('data' => drupal_render($form['views'][$key]['value'])), - array('data' => drupal_render($form['views'][$key]['title'])) - ); - } - - $output .= theme('table', $form['header_cck']['#value'], $rows_type); - $output .= theme('table', $form['header_views']['#value'], $rows_view); $output .= drupal_render($form); return $output; } -function import_export_tool_types_views_import_validate($form, $form_state) { - $selected = $form_state['clicked_button']['#post']; - $types = array(); - $views = array(); - - foreach ($selected as $key => $value) { - if (strstr($key, '_vw_')) { - $view_temp = str_replace('_vw_', '', $key); - $views[$view_temp] = $view_temp; - } - elseif (strstr($key, '_cck_')) { - $type_temp = str_replace('_cck_', '', $key); - $types[$type_temp] = $type_temp; - } - } - - $total_checked = count($types) + count($views); - - if ($total_checked == 0) { - drupal_set_message('Please select at least 1 value', 'error'); - } +function theme_import_export_tool_export_form($form) { + return theme('import_export_tool_import_form', $form); } -function import_export_tool_types_views_export_validate($form, $form_state) { - $selected = $form_state['clicked_button']['#post']; - $types = array(); - $views = array(); - - foreach ($selected as $key => $value) { - if (strstr($key, '_vw_')) { - $view_temp = str_replace('_vw_', '', $key); - $views[$view_temp] = $view_temp; - } - elseif (strstr($key, '_cck_')) { - $type_temp = str_replace('_cck_', '', $key); - $types[$type_temp] = $type_temp; - } - } - - $total_checked = count($types) + count($views); - if ($total_checked == 0) { - drupal_set_message('Please select at least 1 value', 'error'); +function import_export_tool_import_form_validate($form, $form_state) { + if (count(array_filter($form_state['values']['content_types'])) == 0 && count(array_filter($form_state['values']['views'])) == 0) { + form_set_error('content_types', t('Please select at least one content type or view.')); } } -function import_export_tool_types_views_import_submit($form, &$form_state) { - $selected = $form_state['clicked_button']['#post']; - $types = array(); - $views = array(); - - foreach ($selected as $key => $value) { - if (strstr($key, '_vw_')) { - $view_temp = str_replace('_vw_', '', $key); - $views[$view_temp] = $view_temp; - } - elseif (strstr($key, '_cck_')) { - $type_temp = str_replace('_cck_', '', $key); - $types[$type_temp] = $type_temp; - } - } - - $dir = variable_get('import_export_tool_path', file_directory_temp() .'/store'); - - if (count ($types) > 0) { - foreach ($types as $type_name) { - $dump = file_get_contents($dir .'/'. $type_name .'.cck'); - $import_dump = ' 0) { + foreach ($form_state['values']['content_types'] as $type) { + if ($type) { + $macro = file_get_contents($type); + $basename = basename($type, '.cck'); + $types = node_get_types(); + if (in_array($basename, array_keys($types))) { + $state['values']['type_name'] = $basename; + } + else { + $state['values']['type_name'] = ''; + } + $state['values']['macro'] = $macro; + $state['values']['op'] = t('Import'); + drupal_execute('content_copy_import_form', $state); + } } } - - if (count($views) > 0) { + + if (count($form_state['values']['views']) > 0) { views_include('view'); - foreach ($views as $view_name) { - $dump = file_get_contents($dir .'/'. $view_name .'.view'); - ob_start(); - eval($dump); - ob_end_clean(); - $view->save(); - $message = "View : ". $view->name ." has been imported"; - drupal_set_message($message, 'status'); + foreach ($form_state['values']['views'] as $view) { + if ($view) { + $dump = file_get_contents($view); + ob_start(); + eval($dump); + ob_end_clean(); + $view->save(); + drupal_set_message(t("View @view has been imported", array('@view' => $view->name)), 'status'); + } } } } -function import_export_tool_types_views_export_submit($form, &$form_state) { - $selected = $form_state['clicked_button']['#post']; - $types = array(); - $views = array(); - - foreach ($selected as $key => $value) { - if (strstr($key, '_vw_')) { - $view_temp = str_replace('_vw_', '', $key); - $views[$view_temp] = $view_temp; - } - elseif (strstr($key, '_cck_')) { - $type_temp = str_replace('_cck_', '', $key); - $types[$type_temp] = $type_temp; - } - } - - if (count($types) > 0 || count($views) > 0) { - $path = variable_get('import_export_tool_path', file_directory_temp() .'/store'); - if (!is_dir($path)) { - mkdir($path, 0777); - } +function import_export_tool_export_form_submit($form, &$form_state) { + $export_dir = import_export_tool_get_directory(); + // Create the directory. Return FALSE on failure. + if (!file_check_directory($export_dir, FILE_CREATE_DIRECTORY) && !mkdir($export_dir, 0775, TRUE)) { + drupal_set_message(t('Failed to create export directory: %dir', array('%dir' => $export_dir)), 'error'); + return FALSE; } - - if (count($types) > 0) { - foreach ($types as $type_index => $type_name) { - $fields = array_keys(content_copy_fields($type_name)); + + foreach ($form_state['values']['content_types'] as $type) { + if ($type) { + $fields = content_copy_fields($type); + $groups = array(); if (module_exists('fieldgroup')) { - $groups = content_copy_groups($type_name); + $groups = fieldgroup_groups($type); } - $frm['type_name'] = $type_name; - foreach ($groups as $group_index => $group_name) { - $frm['groups'][] = $group_name; - } - foreach ($fields as $field_index => $field_name) { - $frm['fields'][] = $field_name; + $prototype['type_name'] = $type; + foreach ($groups as $group) { + $prototype['groups'][] = $group['group_name']; } - $dump = content_copy_export($frm); - $filename = $type_name .'.cck'; - if (!$handle = fopen($path .'/'. $filename, 'a')) { - drupal_set_message("Cannot open file ($filename)", 'error', TRUE); + foreach ($fields as $field_index => $field_name) { + $prototype['fields'][] = $field_name; } - if (fwrite($handle, $dump) === FALSE) { - drupal_set_message("Cannot write to file ($filename)", 'error', TRUE); + $dump = content_copy_export($prototype); + $filepath = "{$export_dir}/{$type}.cck"; + // Write the .cck file. Return FALSE on failure. + if (!file_save_data($dump, $filepath, FILE_EXISTS_REPLACE)) { + drupal_set_message(t('Failed to write .cck file: %dir', array('%dir' => $filepath)), 'error'); + return FALSE; } else{ - $message = 'CCK Export Complete'; - drupal_set_message($message, 'status', TRUE); + drupal_set_message(t('Wrote content type file: %filepath', array('%filepath' => $filepath)), 'status', TRUE); } - fclose($handle); } } - - $tmp_views = $form_state['values']['views']; + $all_views = views_get_all_views(); - - if (count($views) > 0) { - foreach ($views as $view_name) { - $export_dump = $all_views[$view_name]->export(); - $filename = $view_name .'.view'; - if (!$handle = fopen($path .'/'. $filename, 'a')) { - drupal_set_message("Cannot open file ($filename)", 'error', TRUE); - } - if (fwrite($handle, $export_dump) === FALSE) { - drupal_set_message("Cannot write to file ($filename)", 'error', TRUE); + foreach ($form_state['values']['views'] as $view) { + if ($view) { + $dump = $all_views[$view]->export(); + $filepath = "{$export_dir}/{$view}.views"; + // Write the .views file. Return FALSE on failure. + if (!file_save_data($dump, $filepath, FILE_EXISTS_REPLACE)) { + drupal_set_message(t('Failed to write .views file: %dir', array('%dir' => $filepath)), 'error'); + return FALSE; } else{ - $message = 'VIEWS Export Complete'; - drupal_set_message($message, 'status', TRUE); + drupal_set_message(t('Wrote views file: %filepath', array('%filepath' => $filepath)), 'status', TRUE); } - fclose($handle); } } - } - -function install_content_copy_import_from_file($file) { - ob_start(); - include $file; - ob_end_clean(); - $form_state['values']['type_name'] = ''; - $form_state['values']['macro'] = '$content = '. var_export($content, 1) .';'; - $form_state['values']['op'] = t('Import'); - drupal_execute('content_copy_import_form', $form_state); -} \ No newline at end of file