Index: image.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/image/image.module,v
retrieving revision 1.209.2.14
diff -u -p -r1.209.2.14 image.module
--- image.module	21 Mar 2007 05:28:18 -0000	1.209.2.14
+++ image.module	27 Mar 2007 13:38:06 -0000
@@ -69,6 +69,23 @@ function image_admin_settings() {
   $form['paths'] = array('#type' => 'fieldset', '#title' => t('File paths'));
   $form['paths']['image_default_path'] = array('#type' => 'textfield', '#title' => t('Default image path'), '#default_value' => variable_get('image_default_path', 'images'), '#description' => t('Subdirectory in the directory "%dir" where pictures will be stored. Do not include trailing slash.', array('%dir' => variable_get('file_directory_path', 'files'))));
 
+  $example_tokens = array(
+    '%filespath' => variable_get('file_directory_path', 'files') .'/'. variable_get('image_default_path', 'images') ,
+    '%nodepath' => 'safe/url/example' ,
+    '%filename'=>'sample', 
+    '%type'=>'thumb', 
+    '%extension'=>'jpg', 
+    '%nid'=>666, 
+    '%uid'=>$GLOBALS['user']->uid
+  );
+  $example_path = strtr(variable_get('image_derivatives_filename_pattern', '%path/%filename.%type.%extension'), $example_tokens );
+  $form['paths']['image_derivatives_filename_pattern'] = array(
+    '#type' => 'textfield', 
+    '#title' => t('Filename naming pattern'), 
+    '#default_value' => variable_get('image_derivatives_filename_pattern', '%path/%filename.%type.%extension'), 
+    '#description' => t('Pattern to use when creating derivatives (like thumbnails) for an image. Available tokens are: %filespath %filename %type %extension %nid %uid %nodepath.<br/><pre>%example_path</pre>',array('%example_path'=>$example_path) )
+  );
+
   $form['sizes'] = array('#type' => 'fieldset', '#title' => t('Image sizes'));
   $form['sizes']['image_sizes'] = image_settings_sizes_form();
 
@@ -163,7 +180,7 @@ function image_prepare(&$node, $field_na
       form_set_error($field_name, t('Uploaded file is not a valid image. Only JPG, PNG and GIF files are allowed.'));
       return;
     }
-    $file = file_save_upload($field_name, _image_filename($file->filename, NULL, TRUE));
+    $file = file_save_upload($field_name, _image_filename($file->filename, NULL, TRUE, $node));
     if (!$file) {
       return;
     }
@@ -293,7 +310,7 @@ function image_submit(&$node) {
 /**
  * Implementation of hook_view
  */
-function image_view($node, $teaser = 0, $page = 0) {
+function image_view(&$node, $teaser = 0, $page = 0) {
   $request = ($_GET['size']) ? $_GET['size'] : 'preview';
   $request = check_plain($request);
   $node = node_prepare($node, $teaser);
@@ -555,11 +572,15 @@ function _image_build_derivatives(&$node
     }
     if ($size['label'] && $size['width'] && $size['height']) {
       $source = file_create_path($node->images['_original']);
-      $destination = _image_filename(basename($source), $size['label'], $temp);
+      $destination = _image_filename(basename($source), $size['label'], $temp, $node);
+
+      // using advanced filename patterns, we may need to ensure a directory to put this image into exists 
+      $target_dir = dirname(file_directory_path().'/'.$destination);
+      if(! is_dir($target_dir)){ mkdirs($target_dir); }
 
       if ($info['width'] > $size['width'] || $info['height'] > $size['height']) {
         if (!image_scale($source, file_create_path($destination), $size['width'], $size['height'])) {
-          drupal_set_message(t('Unable to create scaled %label image', array('%label' => $size['label'])), 'error');
+          drupal_set_message(t('Unable to create scalled %label image', array('%label' => $size['label'])), 'error');
           return FALSE;
         }
       }
@@ -594,26 +615,42 @@ function _image_remove_derivatives($node
 /**
  * Creates an image filename.
  */
-function _image_filename($filename, $type = NULL, $temp = FALSE) {
-  $path = variable_get('image_default_path', 'images') .'/';
+function _image_filename($filename, $type = NULL, $temp = FALSE, $node = array() ) {
+  $path = variable_get('image_default_path', 'images') ;
   if ($temp) {
-    $path .= 'temp/';
+    $path .= '/temp';
   }
-
-  if ($type) {
+  
+  // modified by dman to allow for advanced filename generation patterns
+  // and subdirectories for storage
+  
+  if ($type && ($type != '_original') ) {
     $pos = strrpos($filename, '.');
+    // build filename according to token pattern
+    $tokens = array(
+      '%filespath'=>$path,
+      '%nodepath'=>$node->path ? $node->path : $path,
+      '%filename'=>substr($filename, 0, strpos($filename, '.')), 
+      '%type'=>$type,
+      '%extension'=>substr($filename, $pos+1),
+      '%nid'=>$node->nid,
+      '%uid'=>$node->uid,
+    );
+    $filepath = strtr(variable_get('image_derivatives_filename_pattern','%path/%filename.%type.%extension'),$tokens);
+
     if ($pos === false) {
       // The file had no extension - which happens in really old image.module
-      // versions, so figure out the extension.
+      // versions, so figure out the extension. and construct the filename again
       $info = image_get_info(file_create_path($path . $filename));
-      $filename = $filename .'.'. $type .'.'. $info['extension'];
-    }
-    else {
-      $filename = substr($filename, 0, $pos) .'.'. $type . substr($filename, $pos);
-    }
-  }
+      $tokens['%filename']=$filename;
+      $tokens['extension'] = $info['extension'];
+      $filepath = strtr(variable_get('image_derivatives_filename_pattern','%path/%filename.%type.%extension'),$tokens);
+   }
 
-  return $path . $filename;
+  } else {
+    $filepath = $path . '/' . $filename;
+  }
+  return $filepath;
 }
 
 /**
@@ -647,14 +684,14 @@ function _image_insert($node, $label, $i
   if (($label != '_original') && ($image == file_create_path($node->images['_original']))) {
     return;
   }
+  $dest = _image_filename(basename($image), $label, FALSE, $node);
 
-  $dest = _image_filename(basename($image));
   if (file_move($image, $dest)) {
     $path = file_create_path($dest);
     $info = image_get_info($path);
     $file = new stdClass();
     $file->filename = $label;
-    $file->filepath = _image_filename(basename($image));
+    $file->filepath = $dest;
     $file->filemime = $info['mime_type'];
     $file->filesize = filesize($path);
     $fid = db_next_id('{files}_fid');
@@ -665,3 +702,13 @@ function _image_insert($node, $label, $i
   }
 }
 
+function image_image_alter($node, $path, $label) {
+  //drupal_set_message("IMAGE ALTER: {$node->nid}, $path, $label");
+}
+
+if(! function_exists('mkdirs')){ // this is so trivial as to maybe be done elsewhere
+  function mkdirs($strPath, $mode = 0777) //creates directory tree recursively
+  {
+     return is_dir($strPath) or ( mkdirs(dirname($strPath), $mode) and mkdir($strPath, $mode) );
+  }
+}
