? 730578-filefield_sources_views.patch
? filefield_sources-730578_1.patch
Index: sources/reference.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/filefield_sources/sources/reference.inc,v
retrieving revision 1.6
diff -u -p -r1.6 reference.inc
--- sources/reference.inc	9 Aug 2010 04:11:49 -0000	1.6
+++ sources/reference.inc	3 Dec 2010 19:53:56 -0000
@@ -84,9 +84,47 @@ function filefield_source_reference_sett
       '#type' => 'radios',
       '#default_value' => empty($field['filefield_source_autocomplete']) ? '0' : '1', 
     );
+    
+    if (module_exists('views')) {
+      $views = array('--' => '--');
+      $all_views = views_get_all_views();
+      foreach ($all_views as $view) {
+        if ($view->base_table == 'files' && !empty($view->display['default']->display_options['fields'])) {
+          if ($view->type == 'Default') {
+            $views[t('Default Views')][$view->name] = $view->name;
+          }
+          else {
+            $views[t('Existing Views')][$view->name] = $view->name;
+          }
+        }
+      }
+
+      $return['sources_reference']['advanced'] = array(
+         '#type' => 'fieldset',
+         '#title' => t('Advanced - Files that can be referenced (View)'),
+         '#collapsible' => TRUE,
+         '#collapsed' => !isset($field['filefield_source_advanced_view']) || $field['filefield_source_advanced_view'] == '--',
+       );
+      if (count($views) > 1) {
+        $return['sources_reference']['advanced']['filefield_source_advanced_view'] = array(
+          '#type' => 'select',
+          '#title' => t('View used to select the files'),
+          '#options' => $views,
+          '#default_value' => isset($field['filefield_source_advanced_view']) ? $field['filefield_source_advanced_view'] : '--',
+          '#description' => t('Choose the view that selects the files that can be referenced. Only views with type "file" are shown here.'),
+        );
+      }
+      else {
+        $return['sources_reference']['advanced']['filefield_source_no_view_help'] = array(
+          '#value' => t('The list of files that can be referenced can be based on a view but no appropriate views were found. Please create a view with the type "file."'),
+        );
+      }
+    }
+
   }
   elseif ($op == 'save') {
     $return[] = 'filefield_source_autocomplete';
+    $return[] = 'filefield_source_advanced_view';
   }
 
   return $return;
@@ -187,7 +225,7 @@ function theme_filefield_source_referenc
 /**
  * Get all the files used within a particular field (or all fields).
  *
- * @param $file_name
+ * @param $filename
  *   The partial name of the file to retrieve.
  * @param $field
  *   Optional. A CCK field array for which to filter returned files.
@@ -209,13 +247,89 @@ function filefield_source_reference_get_
     $db_info = content_database_info($field);
 
     // 1 == contains, 0 == starts with.
-    $like = empty($field['widget']['filefield_source_autocomplete']) ? '%s%%' : '%%%s%%';
-    $result = db_query_range("SELECT f.* FROM {" . $db_info['table'] . "} c INNER JOIN {files} f ON c." . $db_info['columns']['fid']['column'] . " = f.fid WHERE f.filename LIKE '" . $like . "' AND f.status = 1 ORDER BY f.timestamp DESC", $filename, 0, 30);
-
-    while ($file = db_fetch_object($result)) {
-      $files[$file->fid] = $file;
+    // Adds views support
+    if ( $field['widget']['filefield_source_advanced_view'] != '--' ) {
+      $autocomplete = empty($field['widget']['filefield_source_autocomplete']) ? 'starts_with' : 'contains';
+      $files = _filefield_source_reference_potential_references_views($field, $filename, $field['widget']['filefield_source_autocomplete']);
+    }
+    else {
+      $like = empty($field['widget']['filefield_source_autocomplete']) ? '%s%%' : '%%%s%%';
+      $result = db_query_range("SELECT f.* FROM {" . $db_info['table'] . "} c INNER JOIN {files} f ON c." . $db_info['columns']['fid']['column'] . " = f.fid WHERE f.filename LIKE '" . $like . "' AND f.status = 1 ORDER BY f.timestamp DESC", $filename, 0, 30);
+      while ($file = db_fetch_object($result)) {
+        $files[$file->fid] = $file;
+      }
     }
   }
 
   return $files;
 }
+
+/**
+ * Helper function for _filefield_source_reference_potential_references():
+ * case of Views-defined referenceable files.
+ */
+function _filefield_source_reference_potential_references_views($field, $string = '', $match = 'contains', $ids = array(), $limit = NULL) {
+  $view_name = $field['widget']['filefield_source_advanced_view'];
+
+  if ($view = views_get_view($view_name)) {
+    // We add a display, and let it derive from the 'default' display.
+    // TODO: We should let the user pick a display in the fields settings - sort of requires AHAH...
+    $display = $view->add_display('content_references');
+    $view->set_display($display);
+
+    // We might also need to check if there's an argument, and set its style_plugin as well.
+    $view->display_handler->set_option('style_plugin', 'content_php_array_autocomplete');
+    $view->display_handler->set_option('row_plugin', 'fields');
+    // Used in content_plugin_style_php_array::render(), to get
+    // the 'field' to be used as title.
+    $view->display_handler->set_option('content_title_field', 'filename');
+
+    // Additional options to let content_plugin_display_references::query()
+    // narrow the results.
+    $options = array(
+      'table' => 'files',
+      'field_string' => 'filename',
+      'string' => $string,
+      'match' => $match,
+      'field_id' => 'fid',
+      'ids' => $ids,
+    );
+    $view->display_handler->set_option('content_options', $options);
+
+    // Limit result set size.
+    $limit = isset($limit) ? $limit : 0;
+    $view->display_handler->set_option('items_per_page', $limit);
+
+    $fields = $view->get_items('field', $display);
+    if (!isset($fields['fid'])) {
+      $view->add_item($display, 'field', 'files', 'fid');
+    }
+    if (!isset($fields['filename'])) {
+      $view->add_item($display, 'field', 'files', 'filename');
+    }
+    if (!isset($fields['filesize'])) {
+      $view->add_item($display, 'field', 'files', 'filesize');
+    }
+
+    // Make sure the query is not cached
+    $view->is_cacheable = FALSE;
+
+    // Get the results.
+    $view->render();
+    $files = $view->result;
+    $result = array();
+    foreach ($files as $file) {
+      $result[$file->fid] = array(
+        'fid'=> $file->fid,
+        'filename'  => $file->files_filename,
+        'filesize'  => $file->files_filesize,
+      );
+      $result[$file->fid] = (object) $result[$file->fid];
+    }
+  }
+  else {
+    $result = FALSE;
+  }
+
+  return $result;
+}
