--- image_import.module.old Fri Jan 18 10:59:13 2008 +++ image_import.module Sun Feb 24 20:52:11 2008 @@ -71,7 +71,19 @@ function image_import_form() { taxonomy_form_alter($form, array(), 'image_node_form'); unset($form['type']); unset($form['#node']); + + $form['tree'] = array( + '#type' => 'checkbox', + '#title' => t('Reproduce directories structure with subgalleries'), + '#description' => t('A subgallery will be created only if the folder contains at least an image.'), + ); } + + $form['delete_directories'] = array( + '#type' => 'checkbox', + '#title' => 'Delete empty directories after import', + '#description' => '', + ); // Put the image files into an array for the checkboxes and gather // additional information like dimensions and filesizes. Make sure that @@ -183,6 +195,8 @@ function image_import_form_submit($form, if (file_check_directory($dirpath)) { $nodes = array(); $files = array(); + $subgalleries = array(); + $image_galleries_vid = _image_gallery_get_vid(); foreach (array_filter($form_state['values']['import_file']) as $index) { // try to avoid php's script timeout with a bunch of large files or // a slow machine @@ -191,12 +205,18 @@ function image_import_form_submit($form, } $origname = $form_state['values']['file_list'][$index]; $filename = file_check_location($dirpath .'/'. $origname, $dirpath); + $node_taxonomy = $form_state['values']['taxonomy']; + // if user chose to reproduce directories structure, save the chosen gallery, then create, if needed, the nested galleries where the image goes + if( $form_state['values']['tree'] ) { + $subgalleries_parent_tid = $node_taxonomy[$image_galleries_vid]; + $node_taxonomy[$image_galleries_vid] = _image_import_create_subgalleries($origname,$image_galleries_vid,$subgalleries_parent_tid,$subgalleries); + } if ($filename) { $node = image_create_node_from( $filename, $form_state['values']['title'][$index], $form_state['values']['body'][$index], - $form_state['values']['taxonomy'] + $node_taxonomy ); if ($node) { @@ -220,9 +240,116 @@ function image_import_form_submit($form, else { drupal_set_message(t('No image files were imported.')); } + + // delete empty directories if needed, then report progress + if( $form_state['values']['delete_directories'] ) { + $deleted = _image_import_recursive_delete_empty_directories($dirpath); + if(!empty($deleted)) { + drupal_set_message(t('The following directories were deleted:') . theme('item_list',$deleted)); + } + else { + drupal_set_message(t('No directories were deleted.')); + } + } + } } } + +/** + * Delete recursively all directories inside $basepath. + * + * @param $basepath + * The base directory where to find empty directories. + * @param $dir + * A directory inside $basepath, used for recursive purpose. + * Should not be used when calling this method. + * @return + * An array of the deleted directories paths, relative to $basepath. + */ +function _image_import_recursive_delete_empty_directories($basepath, $dir='') { + $deleted = array(); + // append $basepath to $dir only if $dir is not empty (to avoid trailing slash) + if( $dir != '' ) { + $crnt_dir = $basepath.'/'.$dir; + } else { + $crnt_dir = $basepath; + } + // get each file in $crnt_dir, except . , .. and CVS + $ls = file_scan_directory($crnt_dir, '.*', array('.', '..', 'CVS'), 0, FALSE); + + // for each directory inside + foreach($ls as $file) { + if( is_dir($file->filename) ) { + $next_dir = $dir ? $dir.'/'.$file->basename : $file->basename; + // delete recursively empty directories inside + $deleted = array_merge($deleted, _image_import_recursive_delete_empty_directories($basepath, $next_dir)); + // if the directory is empty, delete it + if( sizeof(file_scan_directory($file->filename, '.*', array('.', '..'), 0, FALSE)) == 0 ) { + rmdir($file->filename); + $deleted[] = '' . $next_dir . ''; + } + } + } + return $deleted; +} + +/** + * Creates subgalleries. + * + * @param $origname + * The original name (with its path) of the image which subcategory has to be created. + * @param $image_galleries_vid + * The vocabulary id of corresponding to image galleries. + * @param $subgalleries_parent_tid + * The term id of the parent gallery, which will contain the subgallery. + * @param $subgalleries + * An array of the tids of each subgallery already created, indexed by subgallery path. + * @return + * The tid of the subgallery in which the image goes to. + */ +function _image_import_create_subgalleries($origname,$image_galleries_vid,$subgalleries_parent_tid,&$subgalleries) { + // get a term id from its parent (if any), its vocabulary, and its name + $tid_query = 'SELECT {term_data}.tid FROM {term_data}, {term_hierarchy} WHERE {term_data}.tid = {term_hierarchy}.tid AND vid = %d AND name = \'%s\' AND parent = %d'; + // get the exploded path to the image + $requested_subgalleries = explode('/', $origname); + // remove the filename at the end + array_pop($requested_subgalleries); + // the parent gallery of the first to be created was passed to this function + $parent_tid = (int) $subgalleries_parent_tid; + // in case there is no sub gallery to create, then the image goes to the parent passed to this function + $subgallery_tid = (int) $subgalleries_parent_tid; + // create each gallery in the path, if necessary + for($i=0; $itid; + // if not, create it + if($subgallery_tid == NULL) { + $subgallery_term = array( + 'name' => $subgallery_name, + 'parent' => $parent_tid, + 'vid' => $image_galleries_vid, + ); + taxonomy_save_term($subgallery_term); + drupal_set_message(t('Created new gallery %term.', array('%term' => $subgallery_name))); + // get its tid back + $db_result = db_fetch_object(db_query($tid_query, $image_galleries_vid, $subgallery_name, $parent_tid)); + $subgallery_tid = (int)$db_result->tid; + } + $subgalleries[$subgallery_path] = $subgallery_tid; + } + // for the next subgallery to be created, last created will be its parent + $parent_tid = (int)$subgallery_tid; + } + return $subgallery_tid; +} function image_import_admin_settings() { $form['image_import_path'] = array(