diff --git a/modules/fileversion/fileversion.module b/modules/fileversion/fileversion.module index 96c4632..8894dda 100755 --- a/modules/fileversion/fileversion.module +++ b/modules/fileversion/fileversion.module @@ -13,6 +13,23 @@ // DEFINING A FIELD //==========================================// +function fileversion_menu() { + return array( + 'fileversion/delete/%node/%' => array( + 'title' => 'Delete all versions', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('fileversion_delete_all_versions_confirm',2,3), + 'access arguments' => array('delete',2) + ), + 'fileversion/deleteversion/%node/%' => array( + 'title' => 'Delete this version', + 'page callback' => 'drupal_get_form', + 'page arguments' => array('fileversion_delete_this_version_confirm',2,3), + 'access arguments' => array('delete',2) + ), + ); +} + /** * Implementation of hook_field_info(). */ @@ -182,7 +199,7 @@ function fileversion_token_values($type, $object = NULL) { * Implementation of hook_theme(). */ function fileversion_theme() { -//drupal_set_message("Inside&&& fileversion_theme"); + return array( // Themes for the formatters. 'fileversion_formatter_default' => array( @@ -222,7 +239,6 @@ function fileversion_theme() { * */ function fileversion_field_formatter_info() { - //drupal_set_message("Inside&&& fileversion_field_formatter_info"); return array( // The machine name of the formatter. 'default' => array( @@ -260,21 +276,16 @@ function fileversion_field_formatter_info() { * */ function theme_fileversion_formatter_default($element) { - - $file = field_file_load($element['#item']['safe']); $field = content_fields($element['#field_name']); - $output = theme('fileversion_item', $file, $field); + $output = theme('fileversion_item',$element['#item']['safe'],$element['#node']->nid); return $output; } -function theme_fileversion_item($file, $field) { - if (fileversion_file_listed($file, $field)) { - return theme('fileversion_file', $file); - } +function theme_fileversion_item($vid,$nid) { + return theme('fileversion_file',$vid,$nid); return ''; } - /** * Return whether a file should be listed when viewing the node. * @@ -283,7 +294,7 @@ function theme_fileversion_item($file, $field) { * @param $field * A CCK field instance array. */ -function fileversion_file_listed($file, $field) { +function fileversion_file_listed($fid, $field) { if (!empty($field['list_field'])) { return !empty($file['list']); } @@ -293,13 +304,20 @@ function fileversion_file_listed($file, $field) { /** * Theme function for the 'generic' single file formatter. */ -function theme_fileversion_file($file) { +function theme_fileversion_file($vid,$nid) { drupal_add_js(drupal_get_path('module', 'fileversion') .'/expand_collapse.js'); drupal_add_css(drupal_get_path('module', 'fileversion').'/fileversion_style.css'); + $result = db_query("select max(fid) as max_fid from {fileversionList} where vid=".(int)$vid); + while ($record = db_fetch_array($result)) { + $fid=$record['max_fid']; + } + + $file=field_file_load($fid); // Views may call this function with a NULL value, return an empty string. if (empty($file['fid'])) { return ''; } + $path = $file['filepath']; $url = file_create_url($path); // Set options as per anchor format described at @@ -315,23 +333,14 @@ function theme_fileversion_file($file) { // Use the description as the link text if available. //if (empty($file['data']['description'])) { $link_text = $file['filename']; - - return '
'. l($link_text, $url, $options) .'
'.'Prev Versions'.theme('fileversion_fileversionList',$file['fid']); + return '
'. l($link_text, $url, $options) .'
'.'Previous Versions'.theme('fileversion_fileversionList',$vid,$nid,1); } -function theme_fileversion_fileversionList($fid) +function theme_fileversion_fileversionList($vid,$nid,$view) { - if(empty($fid)) - return ''; - - $result = db_query("select vid from {fileversionList} where fid=".$fid); - while ($record = db_fetch_array($result)) { - $vid = $record['vid']; - } - + $rows = array(); + if(!empty($vid)){ $result = db_query("select fid from {fileversionList} where vid=".$vid); - - $rows = array(); while ($record = db_fetch_array($result)) { $vfile=field_file_load($record['fid']); $path = $vfile['filepath']; @@ -343,15 +352,20 @@ function theme_fileversion_fileversionList($fid) ); $link_text = $vfile['filename']; - $user = user_load($vfile['uid']); $ts = $vfile['timestamp']; + +$link ='fileversion/deleteversion/'.$nid.'/'.$vfile['fid']; +$delete = l("Delete", $link); + if($view==0){ + $rows[] = array(l($link_text, $url, $options), theme('username', $user), format_date($ts, 'medium'),$delete); + }else{ $rows[] = array(l($link_text, $url, $options), theme('username', $user), format_date($ts, 'medium')); } - + } + } $markup='
'.theme('table', null, $rows).'
'; return $markup; - } @@ -359,7 +373,6 @@ function theme_fileversion_fileversionList($fid) * Theme function for 'plain' fileversion field formatter. */ function theme_fileversion_formatter_plain($element) { - //drupal_set_message("Inside&&& theme_fileversion_formatter_plain"); return strip_tags($element['#item']['safe']); } @@ -466,41 +479,74 @@ function fileversion_widget_settings($op, $widget) { function fileversion_widget(&$form, &$form_state, $field, $items, $delta = 0) { $form['#attributes']['enctype'] = 'multipart/form-data'; - $item = array('value' => 0); $element = array( '#title' => $field['widget']['label'], '#type' => $field['widget']['type'], '#default_value' => $items[$delta], '#attributes' => array('class' => 'fileversion'), ); - return $element; } function fileversion_widget_process($element, $edit, &$form_state, $form) { - $element['#theme'] = 'fileversion_widget_item'; $element['upload'] = array( '#name' => 'files[' . implode('_', $element['#array_parents']) . ']', '#type' => 'file', - //'#description' => implode('
', $desc), '#size' => 22, '#access' => empty($item['value']), '#default_value' => $element['#value']['value'], ); - + + if(isset($element['#default_value']['value'])){ + $result = db_query("SELECT count(fid) as count FROM {fileversionList} where vid=".$element['#default_value']['value']); + while ($record = db_fetch_array($result)) { + $count=$record['count']; + } + }else{ + $count=0; + } + + if($count!=0) + { + + $element['fileversion_remove'] = array( + // With default CCK edit forms, $element['#parents'] is array($element['#field_name'], $element['#delta']). + // However, if some module (for example, flexifield) places our widget deeper in the tree, we want to + // use that information in constructing the button name. + '#name' => implode('_', $element['#parents']) .'_fileversion_remove', + '#type' => 'submit', + '#value' => t('Remove all versions'), + '#field_name' => $element['#field_name'], + '#delta' => $element['#delta'], + '#weight' => 101, + '#post' => $element['#post'], + ); + + // Because the output of this field changes depending on the button clicked, + // we need to ask FAPI immediately if the remove button was clicked. + // It's not good that we call this private function, but + // $form_state['clicked_button'] is only available after this #process + // callback is finished. + + if (_form_button_was_clicked($element['fileversion_remove'])) { + // Delete the file if it is currently unused. Note that field_file_delete() + // does a reference check in addition to our basic status check. + if (isset($edit['value'])) { + drupal_goto('fileversion/delete/'.$form_state['values']['nid'].'/'.$edit['value']); + } + } +} + + $element['#node']=$form_state['values']['nid']; // Set the FID. $element['value'] = array( '#type' => 'hidden', '#value' => $element['#value']['value'], - '#markup' => theme('fileversion_fileversionList',$element['#value']['value']), ); - $element['#default_value']['value']=$element['#value']['value']; - if ($item['value'] != 0) { $element['fileversions'] = array( - '#markup' => theme('theme_fileversion_widget_item',$element), ); } @@ -512,6 +558,78 @@ function fileversion_widget_process($element, $edit, &$form_state, $form) { return $element; } +function fileversion_delete_all_versions_confirm($form_state, $node, $groupversion_id) { + $form['groupversion_id'] = array( + '#type' => 'value', + '#value' => $groupversion_id + ); + $form['nid'] = array( + '#type' => 'value', + '#value' => $node->nid + ); + + return confirm_form($form, + t('Are you sure you want to delete all versions of this file?'), + 'node/'.$node->nid.'/edit', + t('This action cannot be undone.'), + t('Delete all versions'), + t('Cancel') + ); +} + +function fileversion_delete_all_versions_confirm_submit($form, &$form_state) { + // do delete here... + removeAllFileVersions($form['groupversion_id']['#value']); + $form_state['redirect'] = 'node/'.$form_state['values']['nid'].'/edit'; +} + +function fileversion_delete_this_version_confirm($form_state, $node, $fileversion_id) { + $form['fileversion_id'] = array( + '#type' => 'value', + '#value' => $fileversion_id + ); + $form['nid'] = array( + '#type' => 'value', + '#value' => $node->nid + ); + + return confirm_form($form, + t('Are you sure you want to delete this version ?'), + 'node/'.$node->nid.'/edit', + t('This action cannot be undone.'), + t('Delete this version'), + t('Cancel') + ); +} + + +function fileversion_delete_this_version_confirm_submit($form, &$form_state) { + // do delete here... + removeThisFileVersion($form['fileversion_id']['#value']); + $form_state['redirect'] = 'node/'.$form_state['values']['nid'].'/edit'; +} + +function removeThisFileVersion($fid){ + + $removed_file = field_file_load($fid); + if ($removed_file['status'] == 0) { + field_file_delete($removed_file); + db_query('DELETE FROM {fileversionList} WHERE fid = %d', $fid); + } +} + +function removeAllFileVersions($vid) +{ + $result = db_query("select fid from {fileversionList} where vid=".$vid); + while ($record = db_fetch_array($result)) { + $removed_file = field_file_load($record['fid']); + if ($removed_file['status'] == 0) { + field_file_delete($removed_file); + db_query('DELETE FROM {fileversionList} WHERE fid = %d', $record['fid']); + } + } +} + /** * Determine the widget's files directory * @@ -561,50 +679,33 @@ function fileversion_save_upload($element) { form_set_error($upload_name, t('The file in the @field field was unable to be uploaded.', array('@field' => $element['#title']))); return 0; } - return $file['fid']; } function fileversion_widget_value($element, $edit = FALSE) { - if ($edit) { $item = $edit; $field = content_fields($element['#field_name'], $element['#type_name']); - if(! empty($_FILES[files][name][$element['#field_name'].'_'.$element['#delta']])){ + if(! empty($_FILES[files][name][$element['#field_name'].'_'.$element['#delta']]) && isset($edit['value'])){ // Uploads take priority over value of fid text field. + $objFile = new stdClass(); if ($fid = fileversion_save_upload($element)) { - $item['value'] = $fid; + $objFile->fid = $fid; } - - $element['value_fid']=$item['value']; - $objFile = new stdClass(); - $objFile->fid = $item['value']; - if(isset($element['#default_value']['value'])){ - //query to find the original fid - - try{ - $result = db_query("SELECT vid FROM {fileversionList} where fid=".$element['#default_value']['value']); - - while ($record = db_fetch_array($result)) { - $objFile->vid = $record['vid']; - } - }catch(Exception $e) - { - drupal_set_message($e); - } - + $objFile->vid = $item['value']; } else{ - $objFile->vid = $item['value']; + $objFile->vid = $fid; + $item['value'] = $objFile->vid; } - drupal_write_record('fileversionList', $objFile); + drupal_write_record('fileversionList', $objFile); // Load file if the FID has changed so that it can be saved by CCK. - $file = isset($item['value']) ? field_file_load($item['value']) : NULL; + $file = isset($fid) ? field_file_load($fid) : NULL; // If the file entry doesn't exist, don't save anything. if (empty($file)) { @@ -615,30 +716,8 @@ function fileversion_widget_value($element, $edit = FALSE) { } else { - $file = field_file_load($element['#default_value']['value']); - - if(isset($element['#default_value']['value'])){ - //query database - try{ - $result = db_query("SELECT vid FROM {fileversionList} where fid=".$element['#default_value']['value']); - while ($record = db_fetch_array($result)) { - $group_fid = $record['vid']; - } - - $result = db_query("select fid from {fileversionList} where vid=".$group_fid); - //drupal_set_message("select fid from {fileversionList} where vid=".$group_fid); - while ($record = db_fetch_array($result)) { - //drupal_set_message("hello".$record['fid']); - } - }catch(Exception $e) - { - //drupal_set_message($e); - } - - } $item = $element['#default_value']; } - return $item; } @@ -665,14 +744,13 @@ Themes for edit layer function theme_fileversion_widget_item($element) { $element['upload']['#theme'] = 'fileversion_widget_file'; - + $element['upload']['#nid']=$element['#node']; $output = ''; $output .= '
'; $output .= '
'; $output .= drupal_render($element); $output .= '
'; $output .= '
'; - return $output; } @@ -703,7 +781,19 @@ function theme_fileversion_widget_file($element) { } $output .= ''; - $output .= 'Prev Versions'.theme('fileversion_fileversionList',$element['#default_value']); +if($element['#default_value']!=" " && ((int)$element['#default_value']!=0)){ + $result = db_query("SELECT count(fid) as count FROM {fileversionList} where vid=".$element['#default_value']); + while ($record = db_fetch_array($result)) { + $count=$record['count']; + } + }else{ + $count=0; + } + + if($count!=0) + { + $output .= 'Previous Versions'.theme('fileversion_fileversionList',$element['#default_value'],$element['#nid'],0); + } return theme('form_element', $element, $output); }